JDK5以后提供了一个新的锁对象Lock,它能够更加清晰的表达如何加锁和释放锁
- Lock实现提供比使用synchronized方法和语句可以获得的更广泛的锁定操作。
它们允许更灵活的结构化,可能具有完全不同的属性,并且可以支持多个相关联的对象Condition
void lock():获得锁
void unlock():释放锁
- Lock是接口不能直接实例化,这里采用它的实现类ReentrantLock来实例化
- ReentrantLock的构造方法:ReentrantLock()创建一个ReentrantLock的实列
package com.client.aaaaaaaaaaaaaaaa;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
/**
* @author LunarYouI
* @create 2022-07-26 16:29
*/
public class ThreadDemo {
public static void main(String[] args) throws InterruptedException {
Demo demo = new Demo();
Thread 窗口1 = new Thread(demo, "窗口1");
Thread 窗口2 = new Thread(demo, "窗口2");
窗口1.start();
窗口2.start();
}
}
class Demo implements Runnable{
private int num = 100;
private Lock lock = new ReentrantLock();
@Override
public void run() {
while(true){
lock.lock();
try {
if(num>0){
Thread.sleep(100);
System.out.println(Thread.currentThread().getName()+"正在出售第"+num+"票");
num--;
}
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
}
}
注意:lock.lock()后面需要紧跟着try随后在finally中释放lock.unlock()