Skip to content

Synchronized关键字原理以及原子操作的实现原理笔记

ljcan edited this page Jul 8, 2018 · 2 revisions

ImportNew【深入分析Synchronized】

参考 方腾飞的《Java并发的艺术》

原子操作的实现原理

处理器通过总线锁定缓存锁定两种方式来实现原子操作

通过总线锁保证原子性

总线锁总是提供一个LOCK#信号,当一个处理器在总线(垂直总线)上输出此信号时,其他处理器的请求将被阻塞,该处理器独占共享内存。

缓存行锁定来保证原子性

缓存行存在于CPU与内存之间,将需要使用的数据放入高级缓存L1、L2、L3中,加快对数据的访问,使用缓存一致性机制来保证操作的原子性,因为缓存一致性协议会阻止同时两个或两个以上的处理器对共享内存的数据进行修改,否则就会缓存失效。

不过在两种情况下不能使用缓存行锁定:

  1. 当前操作的数据不能被缓存在处理器内部或者操作的数据横跨多个数据缓存行时,处理器会使用总线锁定。
  2. 有些处理器不支持缓存行锁定。

使用CAS操作会引发的三大问题

1.使用CAS操作会引发ABA问题,不过JDK内部也引入了一些解决这些问题的API,本质是引入版本号,即验证操作的时间是否过期。

2.循环开销时间大,如果长时间不成功,会给CPU带来非常大的执行开销。

3.只能保证一个共享变量的原子操作。JDK内部提供了AtomicReference类来保证引用对象之间的原子性,就可以把多个变量放在一个变量中进行CAS操作。(封装在一个类中)。

Clone this wiki locally