加入收藏 | 设为首页 | 会员中心 | 我要投稿 宣城站长网 (https://www.0563zz.cn/)- 数据湖、行业智能、边缘计算、开发、备份!
当前位置: 首页 > 站长资讯 > 动态 > 正文

快速掌握Maven的核心概念

发布时间:2021-01-30 12:36:01 所属栏目:动态 来源:互联网
导读:所以我们输出结果为:4 3.1.5、CAS中ABA问题的解决 CAS并非完美的,它会导致ABA问题,例如:当前内存的值一开始是A,被另外一个线程先改为B然后再改为A,那么当前线程访问的时候发现是A,则认为它没有被其他线程访问过。在某些场景下这样是存在错误风险的。

所以我们输出结果为: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、原子性 — 对比

  • Atomic:竞争激烈时能维持常态,比Lock性能好, 只能同步一个值
  • synchronized:不可中断锁,适合竞争不激烈,可读性好的情况
  • Lock:可中断锁,多样化同步,竞争激烈时能维持常态

四、线程安全性:可见性

简介:一个线程对主内存的修改可以及时被其他线程观察到

导致共享变量在线程间不可见的原因:1.线程交叉执行 2.重新排序结合线程交叉执行 3.共享变量更新后的值没有在工作内存中与主内存间及时更新

4.1 可见性 — syncronized

JMM关于 syncronized的两条规定:

线程解锁前,必须把共享变量的最新值刷新到主内存中

线程加锁时,将清空工作内存中共享变量的值,从而使得使用共享变量时需要从主内存中重新读取最新的值(注意:加锁与解锁是同一把锁) 由于syncronized可以保证原子性及可见性,变量只要被syncronized修饰,就可以放心的使用

4.2 可见性 — volatile

通过加入 内存屏障和 禁止重排序优化来实现可见性。具体实现过程:

  • 对 volatile变量写操作时,会在写操作后加入一条 store屏障指令,将本地内存中的共享变量值刷新到主内存
  • 对 volatile变量读操作时,会在读操作前加入一条 load屏障指令,从主内存中读取共享变量
  • volatile 不能保证操作的原子性,也就是不能保证线程安全性, 如果需要使用 volatile 必须满足以下两个条件:
  • 对变量的写操作不依赖与变量当前的值。
  • 该变量没有包含在具有其他变量的不变的式子中。

所以 volatile修饰的变量适合作为状态标记量。

注:以下图片为资料中获取,如有雷同,纯属巧合

(编辑:宣城站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读