快速掌握Maven的核心概念
|
所以我们输出结果为:4 3.1.5、CAS中ABA问题的解决 CAS并非完美的,它会导致ABA问题,例如:当前内存的值一开始是A,被另外一个线程先改为B然后再改为A,那么当前线程访问的时候发现是A,则认为它没有被其他线程访问过。在某些场景下这样是存在错误风险的。比如在链表中。如何解决这个ABA问题呢,大多数情况下乐观锁的实现都会通过引入一个版本号标记这个对象,每次修改版本号都会变话,比如使用时间戳作为版本号,这样就可以很好的解决ABA问题。在JDK中提供了 AtomicStampedReference类来解决这个问题,这个类维护了一个int类型的标记stamp,每次更新数据的时候顺带更新一下stamp。 3.2、原子性 — synchronized synchronized是一种同步锁,通过锁实现原子操作。1、修饰代码块:大括号括起来的代码,作用于调用的对象 2、修饰方法:整个方法,作用于调用的对象 3、修饰静态方法:整个静态方法,作用于所有对象 4、修饰类:括号括起来的部分,作用于所有对象 详细可以查看,我写的关于:synchronized的博客,因为写过所以就不做过多描述。 3.3、原子性 — 对比
四、线程安全性:可见性 简介:一个线程对主内存的修改可以及时被其他线程观察到 导致共享变量在线程间不可见的原因:1.线程交叉执行 2.重新排序结合线程交叉执行 3.共享变量更新后的值没有在工作内存中与主内存间及时更新 4.1 可见性 — syncronized JMM关于 syncronized的两条规定: 线程解锁前,必须把共享变量的最新值刷新到主内存中 线程加锁时,将清空工作内存中共享变量的值,从而使得使用共享变量时需要从主内存中重新读取最新的值(注意:加锁与解锁是同一把锁) 由于syncronized可以保证原子性及可见性,变量只要被syncronized修饰,就可以放心的使用 4.2 可见性 — volatile 通过加入 内存屏障和 禁止重排序优化来实现可见性。具体实现过程:
所以 volatile修饰的变量适合作为状态标记量。
注:以下图片为资料中获取,如有雷同,纯属巧合 (编辑:宣城站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |

