ReentrantLock与synchronized的区别

目录

一、什么是同步锁?

什么是锁?

二、synchronized

1.Synchronized是什么?

2、Synchronized的用法

3、 Synchronized的部分细节:

三、ReentrantLock

1.ReentrantLock是什么?

2、ReentrantLock的用法

3、ReentrantLock的常用方法

四、比较ReentrantLock与synchronized

总结:


一、什么是同步锁?

        简单来说,就是用一把锁给锁起来,只有获得了这把锁的线程才访问。并且同一时刻, 只有一个线程能持有这把锁, 这样就保证了同一时刻只有一个线程能执行被锁住的代码,从而确保代码的线程安全。

什么是锁?

       每个Java对象都可以充当一个实现同步的锁,这些锁被称为内置锁(Intrinsic Lock)或者监视器锁(Monitor Lock)。

二、synchronized

1.Synchronized是什么?

        是关键字

2、Synchronized的用法

  1. 修饰实例方法:synchronized修饰实例方法, 则用到的锁,默认为this当前方法调用对象;
  2. 修饰静态方法:synchronized修饰静态方法, 则其所用的锁,默认为Class对象;
  3. 修饰代码块:synchronized修饰代码块, 则其所用的锁,是某个指定Java对象;

注意:针对不同的修饰对象,加锁的范围不同,对性能的损耗也不同。

3、 Synchronized的部分细节:

  1.         当一个线程访问对象的一个synchronized(this)同步代码块时,另一个线程仍然可以访问该对象中的非synchronized(this)同步代码块。
  2.         父类中synchronized修饰的方法,如果子类没有重写,则该方法仍然是线程安全性;如果子类重写,并且没有使用synchronized修饰,则该方法不是线程安全的;
  3. 在定义接口方法时,不能使用synchronized关键字;
  4. 构造方法不能使用synchronized关键字,但可以使用synchronized代码块来进行同步;
  5. 离开synchronized代码块后,该线程所持有的锁,会自动释放;

 

三、ReentrantLock

1.ReentrantLock是什么?

        从Java 5开始,引入了一个高级处理并发java.util.concurrent包,它提供了大量更高级的并发功能,能大大简化多线程程序的编写,ReentrantLock就是其中的一个类。

2、ReentrantLock的用法

        ReentrantLock是一个类,所以在使用时与Synchronized不同,需要先创建出对象,再利用对象调用方法去完成一个锁的任务。

3、ReentrantLock的常用方法

  • lock():加锁操作;
  • unlock():释放锁操作;
  • wait():等待锁操作;
  • notify():随机唤醒一个线程;
  • notifyAll():唤醒所有线程;

四、比较ReentrantLock与synchronized

ReentrantLock Synchronized
锁实现机制 AQS 监视器Monitor
获取锁 可以通过tryLock()尝试获取锁,更灵活 线程抢占模型
释放锁 必须显示通过unlock()释放锁 自动释放
锁类型 支持公平锁和非公平锁 非公平锁
可重入性 可重入 可重入
类型 关键字

 

总结:

ReentrantLock与synchronized都是可重入锁吗,可进行的操作类似。

ReentrantLock相较于synchronized可以通过tryLock()尝试获取锁,更灵活。

但不能自动释放锁。

ReentrantLock总共有三个内部类:Sync、NonfairSync、FairSync。
NonfairSync 类继承了 Sync类,表示采用非公平策略获取锁:每一次都尝试获取锁,不会按照公平等待的原则进行等待,不会让等待时间最久的线程获得锁。
FairSync类也继承了 Sync类,表示采用公平策略获取锁:当资源空闲时,它总是会先判断 sync队列是否有等待时间更长的线程,如果存在,则将当前线程加入到等待队列的尾部,实现了公平获取原则。

所以,ReentrantLock既支持公平锁又支持非公平锁,synchronized只支持非公平锁。

注意:ReentrantLock构造函数:默认是采用的非公平策略获取锁。

你可能感兴趣的:(java,jvm,开发语言)