二者的底层实现:
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