Java中ReentrantLock和Synchronized的区别
有多种方法可以使多个线程对共享资源加锁。一种是可重入锁 (Reentrant Lock 或 ReadWriteLock),另一种是使用Synchronized方法。
ReentrantLock类从Java 5开始在Java并发包中提供。
它是Lock接口的实现,根据Java文档,Lock接口的实现提供了比使用synchronized方法所能获得更广泛的操作。
序号 | 关键点 | ReentrantLock | Synchronized |
---|---|---|---|
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 } } }
广告