使用synchronized同步实现窗口抢票
不使用同步的话可能会出现重票或负票的情况
线程有可能和其他线程共享一些资源,比如,内存,文件,数据库等。
当多个线程同时读写同一份共享资源的时候,可能会引起冲突。这时候,我们需要引入线程“同步”机制,即各位线程之间要有个先来后到,不能一窝蜂挤上去抢作一团。
线程同步的真实意思和字面意思恰好相反。线程同步的真实意思,其实是“排队”:几个线程之间要排队,一个一个对共享资源进行操作,而不是同时进行操作。
当多个线程要处理共享资源时,使用同步,但同步不应该过多使用,容易造成死锁
同步方法,同步块,synchronized关键字监视的必须是线程共享的对象
class Tickets{
int num = 10;
public synchronized Boolean saleTickets(){
if (num > 0) {
try {
Thread.sleep(30);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() +
"售出了一张票,余票" + (--num) + "张...");
return true;
}else {
return false;
}
}
}
//火车站类,实现Runnable接口,具备多线程能力
class RailWayStation implements Runnable{
Tickets tickets;//火车站共享十张票
public RailWayStation(Tickets tickets){
this.tickets = tickets;
}
@Override
public void run() {
boolean flag = true;
while (true) {
flag = tickets.saleTickets();
}
}
}
public class Demo05 {
public static void main(String[] args) {
//实例化火车票类
Tickets tickets = new Tickets();
//创建售票窗口
new Thread(new RailWayStation(tickets),"窗口1").start();
new Thread(new RailWayStation(tickets),"窗口2").start();
new Thread(new RailWayStation(tickets),"窗口3").start();
}
}