锁策略及synchronized原理

本文详细探讨了六种锁策略,包括乐观锁、悲观锁、轻量级锁等,以及它们的区别。接着深入解析了synchronized的锁策略和优化机制,如锁升级、锁消除和锁粗化。此外,还介绍了CAS(Compare And Swap)的基础知识及其在实现原子类和自旋锁中的应用,以及ABA问题和解决方案。
摘要由CSDN通过智能技术生成

目录

一.六种锁策略(重点)

1.乐观锁---悲观锁

2.轻量级锁---重量级锁

3.自旋锁---挂起等待锁

4.互斥锁---读写锁

5.公平锁---非公平锁

6.可重入锁---不可重入锁

二.synchronized原理

1.synchronized采取的锁策略

2.优化机制

1)锁升级/锁膨胀

2)锁消除

3)锁粗化

三.CAS

1.CAS是什么?

2.CAS干嘛用的?

1)实现原子类

2)实现自旋锁

3.ABA问题


一.六种锁策略(重点)

锁策略是形容锁的特点的。

1.乐观锁---悲观锁

乐观锁:认为锁竞争不激烈,它在数据发生更新时,会检查是否发生并发冲突。

悲观锁:认为锁竞争很激烈,每次访问共享变量时都会真正地加锁。

2.轻量级锁---重量级锁

轻量级锁加锁解锁操作开销小,效率高。

重量级锁加锁解锁操作开销大,效率低。

3.自旋锁---挂起等待锁

自旋锁是一种轻量级锁,它加锁解锁开销小,会频繁地尝试获取锁,保证了第一时间可以获取到锁,响应速度很快,但是占用了大量的系统资源。

挂起等待锁是一种重量级锁,它如果无法获取到锁,就会等待,响应速度不如自旋锁,但是省下了对系统资源的占用。

4.互斥锁---读写锁

互斥锁提供了加锁和解锁操作,如果一个线程加锁,那么另一个线程像获取锁就会被阻塞。

读写锁针对特定的情形,提供了对读加锁、对写加锁、解锁三个操作,其中读锁和读锁不互斥,写锁和写锁互斥,读锁和写锁互斥。这样的处理方式就能大大提高对读写操作频繁的程序的效率。(基于多线程对同一变量读操作,没有线程安全问题,而一般开发场景中,读操作较写操作更加频繁,此时读写锁就很适合这种场景)

5.公平锁---非公平锁

公平锁:多个线程针对同一个对象加锁,遵循先来后到的原则,先请求加锁的线程可以优先获取到锁。

非公平锁:多个线程针对同一个对象加锁,阻塞等待的线程等可能地获取锁。(synchronized和操作系统实现的锁都是非公平锁)

6.可重入锁---不可重入锁

不可重入锁:一个线程针对一把锁,连续加锁两次,会发生死锁。

可重入锁:一个线程针对一把锁,连续加锁两次,不会发生死锁。(只要以Reentrant开头命名的锁都是可重入锁,JDK提供的所有现成的Lock实现类,包括synchronized关键字锁都是可重入锁,synchronized对重入特殊处理了,采取不加锁的策略


二.synchronized原理

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

todd1er

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值