首页 > 其他分享 >Synchronized锁和Reentrantlock的区别和联系以及锁升级

Synchronized锁和Reentrantlock的区别和联系以及锁升级

时间:2024-10-11 12:48:08浏览次数:13  
标签:这个 Synchronized Reentrantlock 升级 加锁 线程 进行

二者的底层实现:

Synchronized就是基于monitor对象主要的为

Owner获得这个锁资源的线程唯一标识符(线程ID)
Count线程获得几次锁(可重入锁的实现)
Contention List等待队列(线程加锁失败的情况下)

Reentrantlock是基于AQS

这个就是表示是哪一个线程获得这个锁资源

                                         这个就是表示的是这个锁有没有被其他线程获得或者说相同的线程获得了几次锁(也就是可重入锁)

联系: 这两个锁都是可重入锁并且都是实现了同步机制

区别:  

1.从类型来说:

Synchronized是一个关键字并且是JVM层面上面的锁但是Reentrantlock是一个类并且实现了lock接口

2.从加锁以及解锁的过程来说

Synchronized可以修饰一个方法这个方法可以是静态方法也可以是非静态方法这个就产生了 类锁(对于这个类的所有的实例来说只有一个线程可以获得这个锁资源)以及对象锁(对于类的一个对象实例来说只有一个线程可以获得锁资源)除此以外加锁都是自动加锁

Reentrantlock的加锁和解锁都是需要进行手动进行的并且除此以外再进行解锁的时候我们是再finally语句块进行unlock方法(释放锁资源)原因: 如果一个线程获得锁资源之后但是这个时候出现异常这个时候是不会释放锁资源的这个时候其他线程就会处于阻塞的状态

3.加锁的方式来说

Reentrantlock可以实现非阻塞式加锁的方式

这个进行加锁操作的话如果加锁失败的时候那么就会返回false,这个时候我们就会让这个线程做其 他的事情提高了线程的利用率

 这个进行加锁操作的时候会设置一个等待的时间,如果在设置设置的时间的范围里面还是加锁失败的话那么就会返回false

4.Reentrantlock还可以实现公平锁和非公平锁:

本质上就是加锁的时候就是要判断阻塞队列中是否有线程进行排队等待

5.Reentrantlock还可以实现Condition条件的绑定:

简单来说就是说如果一个线程在被Condition的实例对象使用await()方法之后那么如果想要将其进行唤醒的话那么就需要再次通过相同的Condition的实例对象使用sign进行一次的唤醒才会执行后面的业务逻辑signall的意思将被这个条件绑定的所有的线程都进行唤醒

Synchronized锁升级:

就是 无锁 偏向锁(这个在我看来就是一个标识符) 轻量级锁 重量级锁进行升级的过程

标签:这个,Synchronized,Reentrantlock,升级,加锁,线程,进行
From: https://blog.csdn.net/2201_75397629/article/details/142782210

相关文章

  • pg大版本升级
    pg大版本升级环境9.6.24升级到14.13同一台机器本地升级步骤新版本需要初始化数据库initdb。创建测试数据:sysbench--db-driver=pgsql--pgsql-host=127.0.0.1--pgsql-port=5432--pgsql-user=postgres--pgsql-db=testdb--table_size=10000000--tables=1--threa......
  • Mac 系统终端和vscode终端的pnpm版本和路径不一致问题,而且vscode终端的pnpm没法升级
    系统终端whichpnpm路径是/Users/zhanglinfeng/.nvm/versions/node/v16.19.1/bin/pnpm vscode终端 whichpnpm 路径是/usr/local/bin/pnpm 为了跟系统的一致,需要修改.zshrc文件新的#AddRVMtoPATHforscripting.MakesurethisisthelastPATHvariablec......
  • 在K8S中,Deployment 升级过程有哪些?
    在Kubernetes(K8s)中,Deployment的升级过程是一个受控且平滑的过程,用于将应用的新版本无缝地替换旧版本。以下是Deployment升级过程的详细步骤:1.更新Deployment配置准备新版本镜像或配置:确定新版本的应用程序镜像或需要更改的配置。更新Deployment的YAML配置文件,例如更改镜像......