马士兵java多线程

 

P11-volatile关键字的字节码原语

 

P22-synchronized与volatile的硬件级实现

 

P33-无锁、偏向锁、轻量级锁、重量级锁升级过程

查看java扩展属性的相关参数

java -XX:+PrintFlagsFinal -version | grep Thread

 

P4多线程与高并发4-内存屏障的基本概念

马士兵java多线程_第1张图片

添加volatile关键字保证线程可见性,是否相当于while处在读取running的时候每次都去内存中取一次running的值?

马士兵java多线程_第2张图片

计算机组成

马士兵java多线程_第3张图片

马士兵java多线程_第4张图片

马士兵java多线程_第5张图片

 

线程是CPU执行的基本单位

进程是CPU分配资源的基本单位

单核单线程,线程间切换成本高

超线程,一个alu对应2组pc和registers,只需要切换alu即可,执行效率更高了

马士兵java多线程_第6张图片

CPU读出内存数据是按块读取的,x被访问导致与其相邻的y被读取的可能性大大提高了,所以会按块读取x及其相邻的数据

这个数据块就是cache line,单位为64字节,当达到64字节后,会用新的cache line,这时线程a修改x后,就不会通知线程b重新读取了,提高了执行效率。这就是缓存行对齐,discurptor的源码中就使用了这样的方式。
马士兵java多线程_第7张图片 无论从前面读取还是从后面读取,cursor都会单独存在cache line中,不用通知其他线程重新从内存读取该值,提供执行效率

马士兵java多线程_第8张图片

标记了volatile后,cpu就会保存数据一致性(ai进程修改数据后,通知b进程数据已被修改,需重新读取,来保证一致性)

 

CPU乱序执行

马士兵java多线程_第9张图片

 

  • P5多线程与高并发5-使用线程池的好与不好
  • P66-为什么阿里开发手册建议自定义线程池
  • P77-自定义线程池的最佳实践
  • P8多线程与高并发:8-常见线程池类型与应用场景
  • P9多线程与高并发:9-JVM规范如何要求内存屏障
  • P1010-硬件层级内存屏障如何帮助java实现高并发
  • P1111-比线程更牛X的线程,压测结果展现纤程威力①
  • P1211-比线程更牛X的线程,压测结果展现纤程威

 

同一个线程可以锁2次,就是重入锁(如果不实现重入锁,子类无法调用父类的方法)

 

基础:

http://mashibing.com/bird.html

 

推荐书籍:

Linux内核设计与实现

你可能感兴趣的:(Java)