Java并发机制深究1-synchronized和volatile
在多线程并发编程中,synchronized和volatile都是很重要的,volatile是轻量级的synchronized。在多处理器编程中保证共享变量的统一性。
1.volatile的使用和原理
如果一个变量被声明为volatile,java线程内存模型确保所有线程中得到变量的值是一致的。
在对volatile修饰的变量进行赋值操作时会引发两个操作:
<1> 把当前处理器缓冲行中的数据写入内存;
<2> 写回内存的操作会使其他cpu中缓存的数据无效。
2.synchronized的原理
Java中的每一个对象都可以作为锁,具体表现为:
<1> 对于普通同步方法,锁是当前实例对象;
<2> 对于静态同步方法,锁是当前class对象;
<3> 对于同步代码块,锁是synchronized括号里配置的对象;
从jvm规范中可以看出synchronized的实现原理,jvm是根据monitor对象来实现的。代码块同步是根据monitorenter和monitorexit指令实现的。
monitorenter指令在编译后插入到同步代码块的开始位置,而monitorexit是插入到代码块的结束和异常处,jvm要保证monitorenter和monitorexit进行配对。当线程执行到monitorenter指令时,获取对象所对应的monitor的所有权,获得对象的锁,此时其他线程访问此对象就处于阻塞状态。当执行到monitorexit时,线程会释放掉锁。