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
}
}
}
广告
数据结构
网络
关系数据库管理系统 (RDBMS)
操作系统
Java
iOS
HTML
CSS
Android
Python
C语言编程
C++
C#
MongoDB
MySQL
Javascript
PHP