//主方法
package day06Thread;
/*
模拟卖票案例:
创建3个线程,同时开启,对共享的票进行出售(需要考虑三个线程避免同时卖一张票问题)
*/
public class Ticket {
public static void main(String[] args) {
//创建Runnable接口的实现类对象
RunnableImpl run = new RunnableImpl();
//创建Thread类对象,构造方法中传递Runnable接口的实现类对象
Thread t0 = new Thread(run);
Thread t1 = new Thread(run);
Thread t2 = new Thread(run);
//调用start方法开启多线程
t0.start();
t1.start();
t2.start();
}
}
//实现类
package day06Thread;
/*
解决线程的安全问题第三中方法:Lock锁
//1.在成员位置创建一个ReentrantLock对象
//2.在可能出现安全问题的代码前调用Lock接口中的方法Lock获取锁
//3.在可能会出现问题的代码后调用Lock接口中的方法使用unlock释放锁
*/
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class RunnableImpl implements Runnable{
//定义车站票数
private int ticket = 100;
//1.在成员位置创建一个ReentrantLock对象
Lock l1 = new ReentrantLock();
//设置线程任务:卖票
@Override
public void run() {
//无限循环
while (true){
//2.在可能出现安全问题的代码前调用Lock接口中的方法Lock获取锁
l1.lock();
//判断
if (ticket > 0) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}finally {
//3.在可能会出现问题的代码后调用Lock接口中的方法使用unlock释放锁
l1.unlock();
}
//票数合法( > 0)
System.out.println(Thread.currentThread().getName()+"-->>正在卖第" + ticket + "张票");
ticket--;}
else if(ticket <= 0){
break;
}
}
}
}
06-09
1106
![](https://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png)
11-28
1207
![](https://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png)