在卖票案例中会出现两个问题:
1.多个线程执行同一条语句产生了冲突
2.导致数据出现异常
以上两个问题可以总结为:数据安全问题。
Java提供了解决数据安全的方式:使用同步代码块
public class SellTickets implements Runnable{ //共有100张票 private int tickets = 100; private Object obj = new Object(); @Override public void run() { //票数大于0就买票,并告知是哪个窗口卖的 //每卖一张后,总票数要减1 //即使票没了也仍可能有人买票,所以使用死循环 while (true) { //锁多条语句操作共享数据,当线程1运行进入锁时,对外相当于被锁起来,其他线程只能等待线程1运行结束才能进入。 synchronized (obj) { if (tickets > 0) { try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName() + "正在出售第" + tickets + "张票"); tickets--; } } } } }
运行结果: