package cn.dali3.code05;
/*解决线程安全问题的第三种方法:
* jdk1.5之后出现了新的接口 Lock
* 包:java.util.concurrent.locks
*
* 使用步骤:
* 1.在成员位置创建一个Reentrantlock的对象
* 2.在可能出现问题的代码前插入lock方法
* 3.在结尾插入unlock方法
* 注意:为了保证代码是否有异常都能释放,一般我们把unlock放入finally里*/
public class Demo01 {
public static void main(String[] args) {
Runnable run = new RunnableImpl();
Thread th0 = new Thread(run);//创建第一个窗口
Thread th1 = new Thread(run);//创建第二个窗口
Thread th2 = new Thread(run);//创建第三个窗口
th0.start();
th1.start();
th2.start();
}
}
接口的实现类:
package cn.dali3.code05;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class RunnableImpl implements Runnable {
private int ticket = 100;
Lock l = new ReentrantLock();
@Override
public void run() {
while (true) {
l.lock();
if (ticket > 0) {
try {
Thread.currentThread().sleep(10);
System.out.println(Thread.currentThread().getName() + "窗口" + "正在卖第" + ticket + "张票");
ticket--;
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
l.unlock();
}
}
}
}
}