Synchronized学习笔记

Synchronized

在jdk1.2时内部全是重量级锁
重量级锁对应轻量级锁
重量级锁:JVM不负责对线程和锁的竞争分配释放管理,交给操作系统来负责,所以重量级
轻量级锁也叫(无锁 自旋锁):不需要操作系统来管理,JVM自己管理 所以轻量级

JUC 原子类中 AtomicInteger内部实现是轻量级锁(无锁、自旋锁)
在这里插入图片描述

AtomicInteger里对变量自增的方法IncrementAndGet 中调用了unsafe 类的getAndAddnt
在这里插入图片描述

getAndAddnt调用CompareAndSwapInt方法
在这里插入图片描述

CAS(CompareAndSwap)(轻量级锁、自旋锁、无锁(三个是同一个概念)的一种实现方式 比较并交换 )
当线程拿到值并修改后在写回去的过程中要先比较当前值E是否与修改前的值相等,保证没有其他线程来修改过它,是就把修改后的值写回去,不是就重新读取值,再次进行修改,重复上述过程。
ABA问题:就是修改后比较是虽然值是与修改前相等的,但是它已经经历过ABA的过程,也就是另外两个线程进来把A修改成B后又修改回A,这样就会在复杂的数据类型时如对象里面的引用值改了。解决方法加Version 版本号,修改一次版本号加一(一种是用Boolean类型,另一种加时间戳)

在这里插入图片描述

CAS本身要具备原子性(因为在比较过程中被打断就会导致修改的值没写回去)
CAS底层实现原子性的过程 代码是C++实现的
在这里插入图片描述
在这里插入图片描述

如果是单核CPU就直接实现,多核就加lock ,保证没有其他CPU核的线程来打断
在这里插入图片描述

轻量级锁和重量级锁的区别

重量级:操作系统有个队列线程进去排队,线程在等,进入阻塞状态(不占用CPU资源)
轻量级:如果很多线程在等待,CPU回将大多数时间进行线程切换。所以轻量级在线程执行时间短,任务少就效率高,相反就重量级效率高

Synchronized是非公平锁(谁抢到算谁的)
JDK1.6 对锁的实现引入了大量的优化,如自旋锁、适应性自旋锁、锁消除、锁粗化、偏向锁、轻量级锁等技术来减少锁操作的开销。所以,你会发现目前的话,不论是各种开源框架还是 JDK 源码都大量使用了 synchronized 关键字。

偏向锁不是一把锁:是做同步的机制,标签 没有锁竞争时把线程ID号贴上去,在这个线程再次重入这个被锁的方法时,看线程ID号还是自己的就直接进去,不用抢锁(方便可重入)(偏向于第一个进入的线程 所以叫偏向锁),如果ID号变了就升级成轻量级锁或者重量级锁
在这里插入图片描述

对象在内存中的布局里提到的Markword里记录了锁信息

无锁态001
偏向锁101

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值