Lock 锁
1. 概要
- 从 JDK5 开始,Java提供了更强大的线程同步机制——通过显式定义同步锁对象来实现同步。同步锁使用 Lock 对象充当
java.util.concurrent.locks.Lock
接口是控制多个线程对共享资源访问的工具- 锁提供了对共享资源的独占访问,每次只能有一个线程对 Lock 对象加锁,线程开始访问共享资源前须先获得 Lock 对象
ReentrantLock
类(可重入锁)实现了 Lock ,它拥有与synchronized
相同的并发性和内存语义- 在实现线程安全的控制中,比较常用的是
ReentrantLock
,可以显式地加锁、释放锁
2. 例
public class TestLock {
public static void main(String[] args) {
TestLock2 testLock2 = new TestLock2();
new Thread(testLock2).start();
new Thread(testLock2).start();
new Thread(testLock2).start();
}
}
class TestLock2 implements Runnable {
int ticketNum = 10;
private final ReentrantLock lock = new ReentrantLock();
@Override
public void run() {
while (true) {
try {
lock.lock();
if (ticketNum > 0) {
Thread.sleep(1000);
System.out.println(ticketNum--);
} else {
break;
}
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
}
}
3. 与synchronized
的对比
- Lock 是显式锁,须手动开启和关闭,
syncharonized
是隐式的,出了作用域自动释放 - Lock 只有代码块锁,
synchronized
有代码块锁和方法锁 - 使用 Lock 锁,JVM将花费较少的时间调度线程,性能更好。并且具有更好的扩展性,提供更多的子类
- 优先使用顺序: