ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

多线程 从理论到实践

多线程 从理论到实践 一、JMMJava内存模型CPU -高速缓存 -物理内存(CPU读写速度不一致)JMM屏蔽掉各种硬件和操作系统的内存差异以实现让Java程序在各种平台下都能达到一致的内存访问效果抽象的概念仅仅描述的是一组约定或规范二、原子性可见性有序性1、原子性要么发生要么不发生不存在中间的状态2、可见性当一个线程修改了某个共享变量值其他线程能否立即知道该变更JMM规定所有的变量都存储在主内存中。注意线程不能直接操作主内存只能操作主内存副本拷贝各个线程之间无法访问对方工作空间只能通过主内存问题脏读3、有序性指令重排序只要程序的最终结果与它的顺序执行结果相等那么指令的执行顺序可以与代码顺序不一致数据依赖性例如变量先定义后使用三、多线程 先行发生原则之happens-before如果一个操作执行的结果需要对另一个操作可见性或者代码重排序那么两个操作之间必须存在happens-before先行发生原则四、volatile可见性将各个线程的自己工作空间的值刷新回主内存使之 此值 在各个线程之间可见volatile 主要保证可见性和有序性。一个线程对 volatile 变量的写对后续读取该 volatile 变量的线程可见同时 volatile 会通过内存屏障等机制限制特定的指令重排序volatile 不保证复合操作的原子性五、CAS与原子类CASCompare And Swap 比较当前值是否等于预期值 相等 → 更新 不等 → 更新失败/重试AtomicReference 原子引用类由于CAS存在 ABA问题故引出 AtomicStampedReference六、锁synchronized ReentrantLock同可重入锁异ReentrantLock更加灵活可以手动加锁解锁功能更加强大注可重入锁简单来说就是同一把锁可以被多次持有若已经获得该锁那么再次获取该锁时可以成功获取不会出现A一直等待A释放锁的场景但获取几次就需要释放几次七、原理1、synchronized 原理监视器MonitorJVM 用于实现重量级同步的监视器结构Mark WordJava对象对象头对象体数据填充对象头Mark Word 类型指针Mark WordhashCode GC 年龄 锁状态 与锁相关的数据无锁-轻量级锁-重量级锁锁竞争严重后膨胀为 Monitor管理八、应用通过接口对设备下发控制命令再 处理设备返回信息从而获取下发控制命令是否成功的返回结果CommandController 下发控制命令的接口类ReceiveMessageHandler 处理设备返回信息Command 命令类那么我们需要考虑异步获取返回结构future连接对两个线程可见修改是可见的volatile同一个命令下发期间串行化保证业务需求与执行结果一致synchronized / Lock伪代码如下private volatile boolean isConnectedfalse;CommandControllerif(isConnected){ ...... synchronized(){ 初始化future; 下发command; future.get(); } ...... }ReceiveMessageHandlerif(isConnected){ ...... 处理返回结果 boolean result future.complete(result); ...... }以上。
返回列表