使用同步代码块:保证了数据的安全性,因为售票不止一个售票点,多个售票点同时操作同一个数据(卖票)会出现错误。
实例:
package cn.edu.pzhu;
//票务中心
class TicketsCenter {
private int tickets;
public TicketsCenter(int tickets) {
this.tickets = tickets;
}
//卖票
public void sell(Seller seller) {
System.out.print(seller.getName()+": ");
if (tickets > 0) {
System.out.println("还剩余"+tickets+"张火车票.");
try {
Thread.sleep(1000);//模拟网络延迟
} catch (InterruptedException e) {
e.printStackTrace();
}
tickets--;
} else {
System.out.println("对不起,没有票了.");
}
}
}
//售票点
class Seller implements Runnable{
private String name; //售票点名称
private static TicketsCenter center = null;
private Thread thread;
public Seller(TicketsCenter tc, String sname) {
if (center == null) {
center = tc;
}
name = sname;
thread = new Thread(this);
thread.start();
}
public String getName() {
return name;
}
@Override
public void run() {
//每个销售点模拟5个用户买票
for(int i = 0; i < 5; i++) {
synchronized (center) {
center.sell(this);
}
}
}
}
public class TestDemo {
public static void main(String[] args) {
//初始化一个拥有15张票的票务中心
TicketsCenter center = new TicketsCenter(15);
//生成4个售票点
Seller seller[] = new Seller[4];
for(int i = 0; i < seller.length; i++) {
seller[i] = new Seller(center, "销售点"+i);
}
}
}
如有不当之处欢迎指出!