学习多线程时写的模拟抢票程序,使用jdk1.7 win64
使用synchronized之后同一个线程连续抢票的概率很高,这是为什么?
public class SellTicket implements Runnable {
public int ticket = 20;
public int count = 0;
@Override
public void run() {
while (true) {
if (ticket > 0) {
ticket--;
count++;
System.out.println(Thread.currentThread().getName() + "抢到了第" + count + "张票,剩余" + ticket + "张票");
} else {
break;
}
}
}
public static void main(String[] args) {
SellTicket st = new SellTicket();
Thread t1 = new Thread(st, "张三");
Thread t2 = new Thread(st, "李四");
Thread t3 = new Thread(st, "王五");
t1.start();
t2.start();
t3.start();
}
}
输出的顺序是这样的,各个线程交替抢票
张三抢到了第1张票,剩余19张票
李四抢到了第2张票,剩余18张票
王五抢到了第4张票,剩余16张票
张三抢到了第3张票,剩余17张票
张三抢到了第7张票,剩余13张票
王五抢到了第6张票,剩余14张票
王五抢到了第9张票,剩余11张票
王五抢到了第10张票,剩余10张票
李四抢到了第5张票,剩余15张票
王五抢到了第11张票,剩余9张票
王五抢到了第13张票,剩余7张票
张三抢到了第8张票,剩余12张票
张三抢到了第15张票,剩余5张票
张三抢到了第16张票,剩余4张票
张三抢到了第17张票,剩余3张票
张三抢到了第18张票,剩余2张票
王五抢到了第14张票,剩余6张票
王五抢到了第20张票,剩余0张票
李四抢到了第12张票,剩余8张票
张三抢到了第19张票,剩余1张票
加上synchronized之后
@Override
public void run() {
while (true) {
synchronized (this) {
if (ticket > 0) {
ticket--;
count++;
System.out.println(Thread.currentThread().getName() + "抢到了第" + count + "张票,剩余" + ticket + "张票");
} else {
break;
}
}
}
}
输出变成了这样,同一个线程抢票的概率很高,经常只有一个线程在抢票
张三抢到了第1张票,剩余19张票
王五抢到了第2张票,剩余18张票
王五抢到了第3张票,剩余17张票
王五抢到了第4张票,剩余16张票
王五抢到了第5张票,剩余15张票
王五抢到了第6张票,剩余14张票
王五抢到了第7张票,剩余13张票
王五抢到了第8张票,剩余12张票
王五抢到了第9张票,剩余11张票
王五抢到了第10张票,剩余10张票
王五抢到了第11张票,剩余9张票
王五抢到了第12张票,剩余8张票
王五抢到了第13张票,剩余7张票
王五抢到了第14张票,剩余6张票
王五抢到了第15张票,剩余5张票
王五抢到了第16张票,剩余4张票
王五抢到了第17张票,剩余3张票
王五抢到了第18张票,剩余2张票
王五抢到了第19张票,剩余1张票
王五抢到了第20张票,剩余0张票
如果在synchronized之前sleep一下,又变成交替抢票了
@Override
public void run() {
while (true) {
try {
Thread.sleep(200);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
synchronized (this) {
if (ticket > 0) {
ticket--;
count++;
System.out.println(Thread.currentThread().getName() + "抢到了第" + count + "张票,剩余" + ticket + "张票");
} else {
break;
}
}
}
}
李四抢到了第1张票,剩余19张票
张三抢到了第2张票,剩余18张票
王五抢到了第3张票,剩余17张票
王五抢到了第4张票,剩余16张票
张三抢到了第5张票,剩余15张票
李四抢到了第6张票,剩余14张票
王五抢到了第7张票,剩余13张票
张三抢到了第8张票,剩余12张票
李四抢到了第9张票,剩余11张票
李四抢到了第10张票,剩余10张票
张三抢到了第11张票,剩余9张票
王五抢到了第12张票,剩余8张票
王五抢到了第13张票,剩余7张票
张三抢到了第14张票,剩余6张票
李四抢到了第15张票,剩余5张票
王五抢到了第16张票,剩余4张票
张三抢到了第17张票,剩余3张票
李四抢到了第18张票,剩余2张票
李四抢到了第19张票,剩余1张票
王五抢到了第20张票,剩余0张票
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…