因为网络存在时延,所以我们的卖票程序很容易在判断的时候同时跑过两个线程从而导致一张票卖两次,所以我们这里来解决下线程安全问题。
同步代码块:
synchronized (对象) {
需要同步的代码;
}
A:对象是什么呢?
我们可以随便创建一一个对象试试。
B :需要同步的代码是哪些呢?
把多条语句操作共享数据的代码的部分给包起来
注意:
同步可以解决安全问题的根本原因就在那个对象上。该对象如同锁的功能。
多个线程必须是同一把锁。
package threadstudy_07;
//某电影院目前正在上映贺岁大片(红高粱,少林寺传奇藏经阁) ,
// 共有100张票,而它有3个售票窗口售票,
// 请设计一个程序模拟该电影院售票。
// 继承Thread类来实现。
//同步代码块:
//synchronized (对象) {
// 需要同步的代码;
// }
public class SellTickerDemo {
public static void main(String[] args) {
SellTicket st=new SellTicket();
Thread t1=new Thread(st,"第1个售票窗口");
Thread t2=new Thread(st,"第2个售票窗口");
Thread t3=new Thread(st,"第3个售票窗口");
t1.start();
t2.start();
t3.start();
}
}
package threadstudy_07;
//同步代码块:
//synchronized (对象) {
// 需要同步的代码;
// }
public class SellTicket implements Runnable {
private int ticket = 100;
private Object obj = new Object();
@Override
public void run() {
while (true) {
synchronized (obj) {
if (ticket > 0) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "正在售出第" + ticket-- +
"票");
}
}
}
}
}