港版/台湾版/澳门版苹果iPhone手机
566 2023-04-03 03:25:08
前言
看了好几遍这本书,对于并发编程入门还是挺不错的,所以拿起键盘总结一下《java并发编程艺术》这本书的总结,计划写7-8篇总结,主要对应书本的每一章节进行总结。
a、不一定,因为创建线程和线程上下文切换(contextswitch)增加了开销,线程太多还有可能比单线程慢
a、减少创建线程创建可以使用线程池
b、无锁并发编程、CAS算法、使用最少线程和使用协程
c、在vm上可以使用vmstat查看上下文的具体情况
a、无锁并发编程的思想就是尽量避免线程去争抢共享资源,每个线程按照资源区间获取数据,比如按照id区间处理数据等
b、CAS算法通俗一点的说法就是带着目标值和旧的值提做更新,而不需要加锁。
c、使用最少的线程就是根据需要创建合适的线程数量。
Java代码编译后变成Java字节码,字节码被类加载器加载到JVM里,JVM执行字节码,最终最终转化为汇编指令在CPU上执行,所以java的并发机制依赖于jvm的实现和cpu的指令。
a、声明为volatile 的变量,可以看做是对普通变量的读写上了同一把锁
b、Java线程内存模型确保所有线程看到这个变量的值是一致的
c、它在多处理器开发中保证了共享变量的内存“可见性”
a、声明为volatile 的变量,在生成汇编执行时,会对生成#LOCK信号
b、Lock前缀的指令在多核处理器下会将当前处理器缓存行的数据写回到系统内存
c、Lock前缀的指令在多核处理器下会将这个写回内存的操作会使在其他CPU里缓存了该内存地址的数据无效
a、锁,用户控制多线程的同步,同步是指程序中用于控制不同线程间操作发生相对顺序的机制
b、jdk1.5之前此锁比较重,在jdk1.6只有引入了偏向锁、轻量级锁。
a、经过sun公司的专家研究发现,在大多数情况下共享资源并不存在竞争,所以对synchronized做出了优化,引入了偏向锁、轻量级锁。
b、synchrnoized的锁是存在Java对象头里的,对象头(非数组)包含两部分数据
- Mark Word 主要存储对象的HashCode、分代年龄和锁标记位
- Klass Work : 这部分主要是存储指向该对象元数据类型的指针
c、偏向锁 - 当线程进入同步块时,会在对象头和栈帧中记录偏向线程id。后续此线程再进入同步快都不需要使用cas进行操作
a、第一个机制是通过总线锁保证原子性
b、第二个机制是通过缓存锁定来保证原子性
a、使用循环CAS实现原子操作
使用cas面临的三大问题
- ABA问题
- 循环时间长开销大
- 只能保证一个共享变量的原子操作
b、使用锁机制实现原子操作
注:锁机制保证了只有获得锁的线程才能够操作锁定的内存区域。JVM内部实现了很多种锁机制,有偏向锁、轻量级锁和互斥锁。有意思的是除了偏向锁,JVM实现锁的方式都用了循环CAS,即当一个线程想进入同步块的时候使用循环CAS的方式来获取锁