多线程volatile关键字的理解

1.java内存模型
java中每一个子线程都有一个工作内存,主线程有一个主内存。假如主内存中有一个静态变量a=0,那么子线程在使用之前都会读取a这个变量放在自己的工作内存中,当子线程使用的时候,就会将自己工作内存的变量取出来使用。
2.java内存模型中的同步交互协议,规定的8种原子操作
@1.lock:将主内存中的变量锁定,为一个线程所独占
@2.unlock:将lock加的锁定解除,此时其他的线程可以有机会访问此变量。
@3.read:作用于主内存变量,将主内存的变量值读到工作内存中
@4.load作用于工作内存中,将read读取的值读到工作哟内存中的变量副本中。
@5.use:作用于工作内存变量,将值传递倒线程的代码执行引擎。
@6.assign:作用于工作内存变量,将执行引擎处理返回的值重新复制给变量副本。
@7.store:作用于工作内存变量,将变量副本的值传递到主内存中。
@8.write:作用于主内存变量,将store传输过来的值写入主内存的共享变量中。
3.操作规范:
@1.主-》子 先read再load,子-》主 先store,在wirte。
@2.做了assign操作,必须同步回主内存,不能没做assgin,同步回主内存。
4.如何保证可见性
@1.final变量
@2.synchronized同步块
@3.volatile修饰
5.synchronized怎么做到可见性?(多线程同步控制)
@1.进入同步块之前,先清空工作内存中的共享变量,从主内存中重新加载
@2.解锁前必须把修改的共享变量同步回主内存。
6.volatile关键字的作用:
@1.保证变量的可见性
@2.限制局部代码指令重排序(jvm会对代码优化重排序)
7.volatile如何保证变量可见性?
@1.使用volatile变量时,必须重新从主内存加载,并且read,load连续的。
@2.修改volatile变量后,必须立马同步回主内存,并且store,write是连续的。
8.voliate于sychronized的区别
@1.使用volatile比sychronized简单
@2.volatile性能比sychronized稍好
9.volatile使用场景(多线程并发)
@1.只有一个修改者,多个使用者
@2.开销较低的“读-写”锁策略
如:
private volatile int value;
public int getValue(){
return value;
}
public synchronized int increment(int num){
return value++;
}

猜你喜欢

转载自blog.csdn.net/weixin_39507514/article/details/88793491