版权声明:尊重原创,码字不易,转载需博主同意。 https://blog.csdn.net/qq_34626097/article/details/88920630
显示锁 Lock
- 在Java 5.0之前,协调共享对象的访问时,可以使用的机制只有synchronized和volatile。Java 5.0后增加了一些新的机制,但并不是一种代替内置锁的方法,而是当内置锁不适用时,作为一种可选择的高级功能。
- ReentrantLock实现了Lock接口,并提供了与synchronized相同的互斥性和内存可见性,但相较于synchronized提供了更高的处理锁的灵活性。
Demo
/*
* 一、可用于解决多线程安全问题的方式:
*
* synchronized:隐式锁
* 1. 同步代码块
*
* 2. 同步方法
*
* 3. 同步锁
*
* jdk 1.5 后: 显示锁
* 4. 同步锁 Lock
* 注意:是一个显示锁,需要通过lock() 方法上锁,必须通过 unlock() 方法进行释放锁
* 通常把 unlock() 放到finally中,以确保其执行释放锁。
*/
public class TestLock {
public static void main(String[] args) {
Ticket tick = new Ticket();
for (int i = 0; i < 3; i++) {
new Thread(tick).start();
}
}
}
class Ticket implements Runnable {
private int tick = 100;
private Lock lock = new ReentrantLock();
@Override
public void run() {
while (true) {
lock.lock();//上锁
try {
if (tick > 0) {
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "完成售票,余票为: " + --tick);
}
//注意:其必须写在finally里面,以保证线程进来之后都会释放锁。
} finally {
lock.unlock();//释放锁
}
}
}
}