前的买票程序一直有一个问题,就是在同一个时间点可能存在两个售票点卖同一张票,这是不符合实际的。
解决方法有两种:
·使用同步方法
·使用同步代码块
使用同步方法
package obc18;
public class ThreadDemo02 implements Runnable{
int ticket = 10;
@Override
public void run() {
saleTicket();
Thread.currentThread().interrupt();
}
public synchronized void saleTicket(){
if(ticket>0){
System.out.println(Thread.currentThread().getName()+"买票成功,剩余票数为:"+ --ticket);
}
}
}
package obc18;
public class OopDemo03 {
public static void main(String[] args) {
ThreadDemo02 th = new ThreadDemo02();
for(int i=0;i<10;i++){
new Thread(th,"张三").start();
new Thread(th,"李四").start();
new Thread(th,"王五").start();
}
}
}
package obc18;
public class ThreadDemo02 implements Runnable{
int ticket = 10;
@Override
public void run() {
synchronized(this) {
if(ticket>0){
System.out.println(Thread.currentThread().getName()+"买票成功,剩余票数为:"+ --ticket);
}
Thread.currentThread().interrupt();
}
}
}
死锁:过多的使用同步将有可能导致死锁,所以使用同步的时候一定考虑清楚是否会出现死锁的情况,否则不要使用同步。



