Skip to content
1447387988 edited this page Apr 23, 2019 · 1 revision

5.2 原理

  1. 使用volitate修饰的变量在汇编阶段,会多出一条lock前缀指令
  2. 它确保指令重排序时不会把其后面的指令排到内存屏障之前的位置,也不会把前面的指令排到内存屏障的后面;即在执行到内存屏障这句指令时,在它前面的操作已经全部完成
  3. 它会强制将对缓存的修改操作立即写入主存
  4. 如果是写操作,它会导致其他CPU里缓存了该内存地址的数据无效

作者:_SOLID 链接:https://www.jianshu.com/p/01188fa8e511 来源:简书 简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

synchronized的4种用法 https://www.cnblogs.com/wnlja/p/3929905.html

Java的三种代理模式 https://www.cnblogs.com/cenyu/p/6289209.html

Java之美[从菜鸟到高手演变]之设计模式 https://blog.csdn.net/zhangerqing/article/details/8194653 面向对象设计原则: http://c.biancheng.net/design_pattern/

https://www.jianshu.com/p/4599ce128085

java内存模型以及happens-before规则 https://www.jianshu.com/p/d52fea0d6ba5

让你彻底理解Synchronized https://www.jianshu.com/p/d53bf830fa09

线程的状态转换以及基本操作 https://www.jianshu.com/p/f65ea68a4a7f

如果锁的是类对象的话,尽管new多个实例对象,但他们仍然是属于同一个类依然会被锁住,即线程之间保证同步关系。

这就是锁的重入性,即在同一锁程中,线程不需要再次获取同一把锁。Synchronized先天具有重入性。每个对象拥有一个计数器,当线程获取该对象锁后,计数器就会加一,释放锁后就会将计数器减一。

CAS的问题

  1. ABA问题 因为CAS会检查旧值有没有变化,这里存在这样一个有意思的问题。比如一个旧值A变为了成B,然后再变成A,刚好在做CAS时检查发现旧值并没有变化依然为A,但是实际上的确发生了变化。解决方案可以沿袭数据库中常用的乐观锁方式,添加一个版本号可以解决。原来的变化路径A->B->A就变成了1A->2B->3C。java这么优秀的语言,当然在java 1.5后的atomic包中提供了AtomicStampedReference来解决ABA问题,解决思路就是这样的

  2. 只能保证一个共享变量的原子操作 当对一个共享变量执行操作时CAS能保证其原子性,如果对多个共享变量进行操作,CAS就不能保证其原子性。有一个解决方案是利用对象整合多个共享变量,即一个类中的成员变量就是这几个共享变量。然后将这个对象做CAS操作就可以保证其原子性。atomic中提供了AtomicReference来保证引用对象之间的原子性。

java 死锁产生原因及解锁(转) https://www.cnblogs.com/yixianyixian/p/8375864.html

SpringMVC开发流程 https://www.jianshu.com/p/5ed8fbd409fb https://www.jianshu.com/p/8a20c547e245

tcp与udp https://blog.csdn.net/sinat_36629696/article/details/80740678

Clone this wiki locally