synchronize的可见性和原子性

synchronize: 可以保证变量可见性和一段代码的原子性
JMM关于synchronized的两条可见性规定:
  *线程解锁前,必须把共享变量的最新值刷新到主内存中
  *线程加锁时,将清空工作内存中共享变量的值,从而使用共享变量时需要从主内存中重新读取最新的值

参考:

https://blog.csdn.net/weixin_42354330/article/details/81944625

 

ReentrantLock的可见性保证

AQS 中的 state 是 volatile的. volatile为了保证可见性, 会在机器指令中加入lock指令, lock强制把缓存(工作内存)写回内存(主内存), 并失效其它线程的缓存行(MESI). 这里要注意的是, lock并不仅仅只是把被volatile修饰的变量写回主内存, 而是把工作内存中的变更都写入主内存

参考:

https://blog.csdn.net/kobexzf/article/details/85214975

 

你可能感兴趣的:(学习)