Java多线程与高并发笔记(CAS、锁升级)

1.CAS

		compare and swap 或者是compare and exchange ,就是用不上锁的方式来保证数据一致,是Java底层的一种操作,实现多线程间的同步,java中的锁升级都是用CAS的方式,包括ActoicInteger等类,底层都是使用CAS,CAS就是一直不断的循环,循环的次数由jvm决定,读入一个变量,然后改动后,在写入之前,去比较原来的变量值是否发生了改变,如果没有改变,就写入,如果改变了,就重新读入,然后一直重复这样的操作。

在这里插入图片描述ABA问题,可以设置一个标记、加上一个版本号或者时间戳等方式进行解决。

2.Java对象

Object o = new Object();

一个对象,在java内存中,对象头占12个字节,其中markword占4个字节,classPointer占4个字节,对其占4个字节,实例数据不一定。

3.锁升级

在这里插入图片描述JVM中,使用重量级锁的时候(synchronized),需要从用户态切换到核心态,就是加锁的过程需要借助操作系统实现,效率低,于是就对synchronized进行了优化,锁升级,java中的锁升级过程为,无锁–>偏向锁–>轻量级锁–>自旋锁–>重量级锁,如果对象没有使用synchronized修饰,默认是无锁的状态,如果有synchronized修饰,先将对象的锁设置为偏向锁,在对象头中的MarkWord中设置,偏向锁,就是偏向某个线程的锁,把线程的id放到MarkWord中,将对象偏向锁默认是打开的,并且会延迟4秒,因为JVM虚拟机自己有一些默认启动的线程,里面有好多sync代码,这些sync代码启动时就知道肯定会有竞争,如果使用偏向锁,就会造成偏向锁不断的进行锁撤销和锁升级的操作,效率较低。如果有线程竞争,就会将偏向锁升级为轻量级锁,线程在自己的线程栈生成LockRecord ,用CAS操作将markword设置为指向自己这个线程的LR的指针,设置成功者得到锁,如果竞争加剧,就会升级为自旋锁,自旋锁,是一个过渡锁,是偏向锁和轻量级锁的过渡。 当获取锁的过程中,未获取到。为了提高效率,JVM 自动执行若干次空循环,再次申请 锁,而不是进入阻塞状态的情况。称为自旋锁。自旋锁提高效率就是避免线程状态的变更。自旋锁不是真正的锁,只是代表不断尝试,不断抢锁,抢锁失败就会升级锁。锁升级的过程都是采用CAS的方式。

发布了11 篇原创文章 · 获赞 8 · 访问量 150

猜你喜欢

转载自blog.csdn.net/weixin_43691723/article/details/105319951