synchronized和juc比较

为什么有了synchronized之后还需要juc的锁呢?

1、synchronized是非公平锁,无法用作公平锁,某些需要公平锁的场景用不了。
2、所以就出现了juc:一系列的锁,除了使用juc原生的锁之外,还可以基于juc提供的锁接口自定义锁,可扩展性好。

CAS流程:

线程读取变量的值到工作内存中,比较该值与线程预期的值是否一致,如果是,则将该变量值改为目标值;
否则,循环重新读取变量值到工作内存中,比较该值与预期的是否一致,如果是,则将该变量值改为目标值;
否则,循环上述步骤,直到修改成功;
如果一直修改不成功呢,就会一直执行这个循环,占用着cpu资源,没法做有意义的事情。

CAS可能会导致的问题:
1、ABA问题:
1)ABA问题是啥?
一个线程x把变量值从A改为了B,后来又来了一个线程y又把变量的值由B改回了A,但是在我这个线程z看来这个变量的值是A,跟我预期的值是一致的,所以就会将A改为了线程z的目标值。
虽然这个变量值最终是A,但是它却是经过了由A->B->A这样的过程,所以这个A值其实不是真正预期的那个没有被修改的了。
对于值相同,但是其实是被修改过的,在某些场景上其实是不允许出现的,比如金融行业上,私下挪用了某人的钱,金额减少,在别人发现前把钱还回去,金额又恢复原数目,但是这笔钱其实是已经被动过的了,而这个是不允许的,私下挪用是犯法的。
2)怎么解决这个ABA问题?
可以对原子类的值加版本号来解决,假如该原子类有个初始值A,初始版本号为1,那么后续的每一次修改都要带上版本号,不仅比较原子类的值本身是否满足预期,还要比较该值的版本号是否满足预期,如果都满足,那么就可以修改原子类变量的值,并且版本号要递增的,如从A->B,则应该是1A->2B,即原子类的值变化了,且值的版本号也增大了;
每一次值的修改,版本号都会增大,那么当发生A->B->A这样的问题时,带上版本号后,就会变为1A->2B->3A,每一次修改时都比较变量值和版本,如果其中任何一个不同,那么最终都不能修改,这样的话,当A经过改为B再重新改为A后,它的版本号变了,就可能与我预期的[A,1]不一致了,最终就不会执行修改操作。

在jdk1.5及之后,出现了AtomicStampedReference这个类,可以用来代理原子类的使用,主要是解决了原子类cas会出现ABA的问题,其解决的原理也是通过版本号实现的。
AtomicStampedReference本质上也是原子类,但是它与其他的原子类的区别是:它封装了一个对象引用,并且为这个对象引用带上一个版本号:[reference, integer],所以其本质上是一个引用/版本的pair对。

版本号是用int类型来记录,而封装的引用类型则是一个泛型。

public class AtomicStampedReference<V> {

    private static class Pair<T> {
        final T reference;
        final int stamp;
        private Pair(T reference, int stamp) {
            this.reference = reference;
            this.stamp = stamp;
        }
        static <T> Pair<T> of(T reference, int stamp) {
            return new Pair<T>(reference, stamp);
        }
    }

    private volatile Pair<V> pair;

    ...
}

所以为了解决CAS的ABA问题,在某些要求严格的场景下,可以使用AtomicStampedReference,而不是直接使用AtomicInteger、AtomicLong等这些。

但是如果场景要求不严格,比如A->B->A后,还可以认为A是同一个的话,那么是可以直接选择使用AtomicInteger、AtomicLong等,而没必要使用AtomicStampedReference。

2、原子性问题:
必须保证原子性:"比较/替换"这两个操作要保证原子性。

原子类为什么可以保证原子性?
原子类里面其实是调用了Unsafe类的compareAndSwap方法,它是一个native方法。
最终C++底层的实现是是:lock,comxchg
先lock,锁总线(其实还会有一个升级过程)
执行了lock之后,才能保证原子性,
再comxchg,完成操作系统级别的CAS。
而如果存粹仅是执行comxchg,还是无法保证原子性的。

CAS效率比synchronized的高?

不一定。
从cpu消耗方面和与操作系统交互方面比较选择哪个好一点?

从任务的耗时层面比较效率:
如果临界区的逻辑非常耗时,那么cas方式在锁被释放前一直在空转,cpu资源没有用于做真正有意义的事情,这样cpu资源就会很浪费,所以对于比较耗时的任务的话,不建议使用cas方式,即不建议使用juc下的锁,像Reentranlock等,而是建议选择synchronized锁。

从与操作系统交互层面来比较效率:
因为当synchronized升级为重量级锁之后,每次获取锁是要通过操作系统决定的,即每个线程获取锁都要涉及到上下文切换,从用户态切换为内核态,又从内核态再切换为用户态,这个过程比较耗时,所以当涉及到获取锁需要访问操作系统时,需要再权衡下锁住的临界区的逻辑是否非常耗时,如果不是非常耗时的逻辑,即可以很快就执行完的,这时候其实是可以选择CAS方式的,因为此时临界区的逻辑耗时短,线程通过CAS空转消耗的CPU资源也就少了,所以可以选择CAS;
但是如果临界区依然是非常耗时的话,那么为了避免CPU资源的浪费还是建议选择synchronized。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容

  • 回顾 传统的synchronized: 如果不在资源类中添加同步synchronized,数据不正常。 我们要添加...
    忒无聊了叭阅读 356评论 1 1
  • 5 Volatile 关键字 保证内存可见和有序向性,但是不保证原子性 虽然synchronized,jvm对它做...
    任笙_8b8c阅读 717评论 0 1
  • Java 基础 语言特性 优点 ① 平台无关,摆脱硬件束缚,"一次编写,到处运行"。 ② 安全的内存管理和访问机制...
    续袁阅读 533评论 0 1
  • CPU时间片轮转机制 CPU时间片轮转机制(RR调度-Round-robin scheduling)原理解释如下:...
    任振铭阅读 974评论 0 10
  • 2018-10-01 推荐原文 死磕Java并发 CAS,Compare And Swap,即比较并交换。Doug...
    vsu阅读 487评论 0 0