【并发】关键字

  

前言

  jdk1.6之前synchronized采用的就是普通的lock,对所有的情况不管是同一个线程的多次访问,还是代码比较短小执行时间短还是代码比较长执行时间长统统都加锁,这就有点一刀切了,不符合具体问题具体分析的辩证法思想,因此,在jdk1.6及之后对synchronized进行了优化,分为偏向锁,轻量级锁和重量级锁。
  volatile是和CAS联合使用的,以达到不加锁但可以保持数据一致性的效果。

synchronized

1.加在什么地方

  类,对象,方法,代码块
这里写图片描述

2.底层实现

  获取monitor监视器即对象头
这里写图片描述

3.synchronized优化

3.1 偏向锁
  定义:同一个线程可以多次获得锁
  原理:当一个线程访问同步块并获取锁时,会在对象头和栈帧中的锁记录里存储锁偏向的线程ID,以后该线程在进入和退出同步块时不需要进行CAS操作来加锁和解锁,只需简单地测试一下对象头的Mark Word里是否存储着指向当前线程的偏向锁。如果测试成功,表示线程已经获得了锁。如果测试失败,则需要再测试一下Mark Word中偏向锁的标识是否设置成1(表示当前是偏向锁):如果没有设置,则使用CAS竞争锁;如果设置了,则尝试使用CAS将对象头的偏向锁指向当前线程
  适用场景:单线程
  参数设置:
  使用JVM参数来关闭延迟:-XX:BiasedLockingStartupDelay=0。
  可以通过JVM参数关闭偏向锁:-XX:-UseBiasedLocking=false
3.2 轻量级锁
这里写图片描述
使用CAS
  CAS简单来说就是本地内存中有一个旧值,并且本地线程根据旧值算出一个新值,现在要把新值更新到主存中。先比较主存中的实际值和旧值是否相等,若相等更新,若不想等则需要自旋,即不停的去查看主存的值和旧值是否相等。
3.3 重量级锁
使用锁

4.优化原理

4.1原理-CAS
(1)实质
乐观锁:冲突重试
sychronized优化前:阻塞同步
(2)优缺点
CAS优点:速度快 sychronized优化前优点:吞吐量大 缺点:消耗时间
CAS缺点:
  1.ABA问题 –加版本号
  2.自旋时间过长 消耗cpu
4.2原理-对象头
对象头里包括:hashcode, 对象分代年龄,锁标识位
这里写图片描述
这里写图片描述

volatile

原理

  每个线程有共享变量的副本,一个线程进行了写操作,jvm会向处理器发送一条lock前缀的指令,将该变量写会系统内存。
  在多处理器下,每个处理器通过嗅探总线上传播的数据来检查自己缓存的数据是否过期,如果过期,会把缓存行设置无效,并重新把系统内存中的值读到处理器缓存。
  volatile一般和CAS一起使用。不然CAS再怎么自旋本地内存中的旧值都和主存中不想等。

内存语义的实现

  为了避免编译器,处理器的重排序,需要插入内存屏障
jmm的内存屏障有:
这里写图片描述
volatile加的内存屏障:
  在每个volatile写操作的前面插入一个StoreStore屏障;
  在每个volatile写操作的后面插入一个StoreLoad屏障;
  在每个volatile读操作的前面插入一个LoadLoad屏障;
  在每个volatile读操作的后面插入一个LoadStore屏障。
  不能保证原子性,可以保证可见性和顺序性

小结

  多线程并发或并行情况下,不可逾越的问题就是如何保持共享资源的一致性。一是通过锁,二是通过关键字。关键字Synchronized是一种优化了的悲观锁,而volatile和CAS是一个典型的乐观锁。

评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值