并发编程(一)并发编程的实现原理
一、并发编程挑战
2、死锁:一组互相竞争资源的线程,因相互等待,导致永久阻塞的现象。
互斥条件 :共享资源 X 与 Y 只能被一个线程占用
占有且等待 :线程 T1 已经取得共享资源 X,在等待共享资源 Y 的时候,不释放 X 资源。
不可剥夺:其他线程不能强行抢占线程已经占有的资源
循环等待:有线程相互等待 ;
避免死锁:只要破坏其中一个条件即可,因为互斥条件是锁本身特性,所以只能破坏其他三个;
占有且等待 :线程一次性获取申请所有资源;
占有且等待 :在线程占有额部分资源,申请另外的资源获取不到时,则主动释放占有的资源;
循环等待:把资源排序,申请资源时可以按顺序申请
二、java 并发线程的底层实现原理
CPU 相关术语:
内存屏障(menory barriers):用于实现内存操作顺序的一组处理器指令
缓冲行(cache line):缓存中分配的最小存储单元。处理器在处理缓存时会加载整个缓存行,锁定整个缓存行(伪共享问题的存在)
1、volatile 的原理
内存的可见性
①、江当前处理器的额缓存行数据写回到系统内存中
②、这个写回内存的操作会使在其他缓存了该内存地址的数据无效
禁止指令重排序
2、synchronized 的实现原理与应用
synchronized 加在普通同步方法,锁是当前对象
对于静态同步方法,锁时当前类的 Class 对象。
对于同步方法块,锁是 synchronized 括号中的对象
monitorenter 指令时在编译后插入到同步块的开始位置,monitorexit 是插入到指令的结束和异常处。任何对象都有一个 monitor 与之关联。
2.2、java 对象头
分为三部分:
Mark word 32/64 bit 默认存储对象的 hashCode、分代年龄和锁标记为
Class metadata address 32/64 bit 存储对象类型数据的引用指针
array length 32/64 bit 存储数组长度(只有对象为数组时才有)
Mark woed 存储结构
在运行期间 Mark word 里存储的数据会根据锁标志位的变化而变化,可能变化为的几种数据:
评论