Java并发编程艺术----读书笔记(二)



java并发编程艺术2

java并发机制的底层实现。

java-》编译——》。class字节码-》字节码加载到JVM-》字节码转化为汇编让cpu执行。

1volatile

 Java并发编程艺术----读书笔记(二)_第1张图片

 

2volatile的定义

 Java并发编程艺术----读书笔记(二)_第2张图片

 

3volatile追加字节提高效率。

 Java并发编程艺术----读书笔记(二)_第3张图片

 

64字节行宽,当不足64字节是不同节点出现在统一缓存行,会出现相互加锁的情况。

 Java并发编程艺术----读书笔记(二)_第4张图片

 

2synchronized

 Java并发编程艺术----读书笔记(二)_第5张图片

 

1、轻量级锁:轻量级锁不使用互斥量来进行加锁。它是在没有多线程竞争的情况下,减少重量级锁使用互斥量的方式加锁的开销。

 

 Java并发编程艺术----读书笔记(二)_第6张图片

 

对象头主要用来存储对象自身的运行数据。

 

1JVM在线程运行同步块之前创建栈帧用于存储锁记录的空间。

2将(所需访问的对象的)对象头中的markword复制到锁记录中。

3线程使用cas操作将markword替换成指向锁的指针,成功即加锁,失败则自旋。

 

 

2、偏向锁:

 Java并发编程艺术----读书笔记(二)_第7张图片

 

1锁不存在竞争并且由单一线程多次获得时使用偏向锁。

2锁记录中记录偏向锁的线程id,此后不需要cas操作来加锁或解锁。只需测试markword里是否存储偏向锁。

3测试成功则已获得锁,否则测试一下偏向锁标识,如果没有设置则使用cas竞争,如果设置了就用cas将偏向锁指向当前线程。

 

3自旋锁

 Java并发编程艺术----读书笔记(二)_第8张图片

 

1线程阻塞需要挂起线程和恢复线程,需要切换到内核态完成。

2有时候共享数据的锁定只会持续很短的时间,为其去挂起和恢复不值得。

3如果多线程并发访问同一对象,可以不对另一线程挂起,而是让它自旋(忙循环)。

 

对比:

 Java并发编程艺术----读书笔记(二)_第9张图片

 

4、原子操作

 

Java并发编程艺术----读书笔记(二)_第10张图片

  Java并发编程艺术----读书笔记(二)_第11张图片

Java并发编程艺术----读书笔记(二)_第12张图片

Java并发编程艺术----读书笔记(二)_第13张图片

Java并发编程艺术----读书笔记(二)_第14张图片

Java并发编程艺术----读书笔记(二)_第15张图片

Java并发编程艺术----读书笔记(二)_第16张图片

Java并发编程艺术----读书笔记(二)_第17张图片

Java并发编程艺术----读书笔记(二)_第18张图片

Java并发编程艺术----读书笔记(二)_第19张图片

  Java并发编程艺术----读书笔记(二)_第20张图片

 

你可能感兴趣的:(Java并发编程艺术----读书笔记(二))