Java中ReentrantLock和Synchronized的区别


有多种方法可以使多个线程对共享资源加锁。一种是可重入锁 (Reentrant Lock 或 ReadWriteLock),另一种是使用Synchronized方法。

ReentrantLock类从Java 5开始在Java并发包中提供。

它是Lock接口的实现,根据Java文档,Lock接口的实现提供了比使用synchronized方法所能获得更广泛的操作。

序号关键点ReentrantLockSynchronized
1
获取锁
Reentrant lock类提供lock()方法,用于线程获取共享资源的锁
只需要编写synchronized关键字即可获取锁
2
释放锁
要释放锁,程序员必须调用unlock()方法
这是隐式完成的
3
中断能力
可以使用lockInterruptibly()方法中断线程
无法中断线程
4
公平性
此类的构造函数具有公平性参数。如果将其设置为true,则锁倾向于向等待时间最长的线程授予访问权限
* 线程
锁不保证任何特定的访问顺序
5
锁释放顺序
锁可以以任何顺序释放
锁应按获取它们的顺序释放

ReentrantLock示例

public class ReentrantLockExample implements Runnable{
   private Lock lock=new ReentrantLock();
   @Override
   public void run() {
      try {
         lock.lock()
         //Lock some resource

      }
      catch (InterruptedException e) {
         e.printStackTrace();
      }
      finally {
         lock.unlock();
      }
   }
}

Synchronized锁示例

public class SynchronizedLockExample implements Runnable{
   @Override
   public void run() {
      synchronized (resource) {
         //Lock some resource
      }
   }
}

更新于:2019年11月18日

2K+ 次查看

启动您的职业生涯

完成课程获得认证

开始学习
广告