Java中锁的分类

发布时间:2024年01月25日

乐观锁、悲观锁

乐观锁:不加锁的并发操作是安全的,使用CAS机制,例如原子类,通过CAS自旋实现原子操作更新。

悲观锁:不加锁的并发操作一定不安全。ReentrantLock,synchronized。

可重入锁

ReentrantLock

当一个线程进入到一个同步方法中,然后在此方法中要调用另一个同步方法,

而且两个方法公用同一把锁

此时线程是可以进入到另一个同步方法中的。

读写锁

ReentrantReadWriteLock

读读共享,读写互斥、写写互斥

分段锁

jdk8之后,去除了真正的分段锁,concurrentHashMap内有给方法加锁;

把锁进一步细粒度化提高并发效率。

自旋锁?

获取锁的一种方式,例如原子类,当抢锁失败后,重试几次,抢到了就继续,抢不到线程阻塞。因

不断地进行尝试,会消耗cpu资源,因此适合时间短的线程,提高效率。

公平锁、非公平锁

公平锁:按照获取锁的顺序分配,ReentrankLock底层可以设置公平锁,默认是非公平锁? ? ? ? ?

构造方法参数为true设置公平锁。??

共享锁、独占锁

共享锁:多个线程共享同一把锁,读写锁中的读读操作

独占锁:synchronized ReentrankLock,读写锁中的写操作

锁的状态

1.无锁

2.偏向锁:一段同步代码被一个线程一直访问,该线程就会自动获取锁,降低获取锁的代价。

3.轻量级锁:在偏向锁的基础上,如果有其他线程访问,将会升级为轻量级锁,让线程以自旋的方式获取锁,线程不会阻塞。

4.重量级锁:当锁为轻量级锁时,自旋不会一直持续下去,达到一定次数后,还没有获取到锁,就会进入阻塞状态,该锁膨胀为重量级锁。当高并发时,获取不到锁的进入阻塞状态,等待操作系统调度

文章来源:https://blog.csdn.net/weixin_63541561/article/details/135689971
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。