一. 这里跟大家分享一下售票系统,这里是一个抢票系统,讨论一下线程同步的作用(关键字synchronized),第一种是正确的程序,下面两种分别是两种不同的错误。
1.运用synchronized同步做的售票程序
packagecom.javaEE.code.synchronizedDemo;
classSellTicket{
public static int tickets = 10;
public synchronized void action(String name){
System.out.println(name+"抢到了"+tickets+"号票");
tickets--;
try {
Thread.sleep(20);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
class TicketThread extends Thread{
String name;
SellTicket t;
public TicketThread(SellTicket t, String name) {
this.t = t;
this.name = name;
start();
}
public void run() {
for(int i=0;i<5;i++){
t.action(name);
}
}
}
public class TestTicket{
public static void main(String[] args) {
SellTicket t = new SellTicket();
TicketThread t1 = new TicketThread(t,"小刚");
TicketThread t2 = new TicketThread(t,"洋洋");
}
}
2.sychronized的特殊情况(错误1)
packagecom.javaEE.code.synchronizedDemo;
/**
* 这种情况就是synchronized的特殊情况,同一个类的不同对象不能用这种方法上锁。
* */
public class Ticket extends Thread {
String name;
public static int tickets = 10;
public Ticket(String name, int tickets) {
super();
this.name = name;
Ticket.tickets = tickets;
}
//这里的锁方法是不管用的。
public synchronized void action(String name){
System.out.println(name+"抢到了"+tickets+"号票");
tickets--;
try {
Thread.sleep(20);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void main(String[] args) {
Ticket t1 = new Ticket("小刚",tickets);
Ticket t2 = new Ticket("洋洋",tickets);
t1.start();
t2.start();
}
public void run() {
for(int i=0;i<5;i++){
action(name);
}