一、搶票類:
package cn.jbit.ticket;
public class Ticket implements Runnable {
private int num = 0; // 出票數
private int count = 10; // 剩余票數
boolean flag = false;
@Override
public void run() {
while (true) {
// 沒有余票時,跳出循環
if (count <= 0) {
break;
}
num++;
count--;
try {
Thread.sleep(500);// 模擬網絡延時
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("顯示出票信息:" + Thread.currentThread().getName()
+ "搶到第" + num + "張票,剩余" + count + "張票");
}
}
}
二、測試類:
package cn.jbit.ticket;
public class Test {
/**
* @param args
*/
public static void main(String[] args) {
Ticket ticket=new Ticket();
// 實例化幾個搶票用戶
Thread mary = new Thread(ticket, "瑪麗");
Thread jack = new Thread(ticket, "傑克");
mary.start();
jack.start();
}
}
不使用線程同步的代碼,結果如下:多個人會搶到同一張票

使用線程同步的話,代碼如下:
package cn.jbit.ticket;
public class Ticket implements Runnable {
private int num = 0; // 出票數
private int count = 10; // 剩余票數
boolean flag = false;
@Override
public void run() {
while (true) {
synchronized (this) {
// 沒有余票時,跳出循環
if (count <= 0) {
break;
}
num++;
count--;
try {
Thread.sleep(500);// 模擬網絡延時
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("顯示出票信息:" + Thread.currentThread().getName()
+ "搶到第" + num + "張票,剩余" + count + "張票");
}
}
}
}
效果如下:

