上接:
说明
ReentrantLock 重入锁,指的是同一线程 外层函数获得锁之后 ,内层递归函数仍然有获取该锁的代码,但不受影响。
例子
用 ReentrantLock 解决卖票的问题
package ReentrantLock;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class 卖票_有锁 implements Runnable {
Lock lock = new ReentrantLock();
public final int COUNT=100;
private int ticket=1;
@Override
public void run() {
while(ticket<=COUNT){
lock.lock(); // 获取锁
if(ticket > COUNT){
break;
}
System.out.println(Thread.currentThread().getName()+"-售出票号:"+ticket);
ticket++;
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
lock.unlock();// 释放锁
}
}
public static void main(String[] args) {
卖票_有锁 ri=new 卖票_有锁();
Thread t1=new Thread(ri,"窗口1");
Thread t2=new Thread(ri,"窗口2");
t1.start();
t2.start();
}
}
执行结果
窗口1-售出票号:82
窗口1-售出票号:83
窗口1-售出票号:84
窗口1-售出票号:85
窗口2-售出票号:86
窗口2-售出票号:87
窗口2-售出票号:88
窗口2-售出票号:89
窗口2-售出票号:90
窗口2-售出票号:91
不会多卖票,也不会重复卖票