下面这个例子是一个多线程买票的错误示例:
public class SaleTicketMutiThread implements Runnable {
int tickets = 100;
int temp = tickets;
boolean flag = true;
@Override
public void run() {
while (flag) {
if (tickets > 0) {
try {
Thread.sleep(30);
} catch (InterruptedException e) {
e.printStackTrace();
}
sale();
} else {
flag = false;
System.out.println(Thread.currentThread().getName() + "卖光了");
}
}
}
public synchronized void sale() {
tickets--;
System.out.println(Thread.currentThread().getName() + " 已卖"
+ (temp - tickets) + "张,系统还剩" + tickets + "张票");
}
/**
* @param args
*/
public static void main(String[] args) {
SaleTicketMutiThread st = new SaleTicketMutiThread();
new Thread(st, "一号窗口").start();
new Thread(st, "二号窗口").start();
new Thread(st, "三号窗口").start();
new Thread(st, "四号窗口").start();
}
}
最后会运行出的结果会出现负数:
......
四号窗口 已卖99张,系统还剩1张票
一号窗口 已卖100张,系统还剩0张票
一号窗口卖光了
三号窗口 已卖101张,系统还剩-1张票
四号窗口 已卖102张,系统还剩-2张票
二号窗口 已卖103张,系统还剩-3张票
我的疑问:
我想问的是 一号窗口线程 取得了 共享变量tickets 的时候, 二、三、四号窗口线程也取得了tickets, 即使这时候一号窗口线程 调用了 sale 方法 对其进行 tickets -- 操作, 二、三、四号窗口线程取得了tickets还是先前的,没有执行tickets -- 操作 ; |