JAVA并发编程笔记
1.并发变成的实现原理
Volatile
Volatile是轻量级的同步(synchronized),在多处理开发中保证了共享变量的可见性,指一个线程修改一个共享变量时,另外一个线程可以读到这个修改的值,其中instance是volatile的变量。
实现原则
1.Lock前缀指令会引起处理器缓存存回写到内存
2.一个处理器的缓存回写到内存会导致其他处理器缓存无效
synchronized(重量级锁)
在实现同步的基础中,每一个对象可以作为锁,表现为
1.普通同步方法,锁是当前实例对象
2.对于同步静态方法,锁是当前CLAASS
3.对于同步方法块,锁是Synchonized括号里配置的对象
Synchronized的锁存在Java的对象头中,而且每个锁都有的优劣势
锁 | 优点 | 缺点 | 适用场景 |
偏向锁 |
加锁和解锁不需要额外的消耗, 和执行非同步方法相比仅存在纳秒级的差距 |
如果线程存在竞争会带来 额外的锁撤销消耗 |
一个线程 访问同步块场景 |
轻量级锁 |
竞争的线程不会阻塞,提高了程序的 响应速度 |
如果始终得不到锁竞争的线程, 使用自旋会消耗cpu |
追求响应时间 同步块执行速度非常快 |
重量级锁 | 线程竞争不使用自旋,不会消耗cpu | 线程阻塞,响应时间缓慢 |
追求吞吐量 同步块时间执行速度较长 |
并发编程模型
在并发编程中,需要处理两个问题,线程之间如何通信及线程之间如何同步,线程之间氛围,共享内存和消息传递
1.共享内存的并发模型中,线程之间共享程序的公共状态,通过写读内存中的公共状态进行隐式通信,在消息传递的并发模型中,线程之间没有公共状态,线程之间必须通过发送消息来显示进行通信
2.同步指程序中用于控制不同线程之间操作发生相对顺序的机制,在共享内存并发模型里,同步是显式进行的.
而并发采用的是共享内存模型,Java线程之间通信总是隐式进行,过程对程序员完全透明,所以如果不了解通信机制时会产生内存可见性问题
JMM
java线程之间的通信由内存模型控制,jmm定义了线程和主内存之间的抽象关系,线程之间共享变量存储在主内存,每一个线程都有一个本地内存,本地内存中存储了该线程以读写共享变量的副本。
happens-before
用来定义分布式系统中事件的篇序关系,jmm通过happens-before关系向程序员提供跨线程的内存可见性保证.保证多线程执行结果不被改变
as-if-serial保证了但线程内程序的执行结果不被改变。