我们知道Thread存在单继承局限,并且数据不能共享,所以我们用Runnable来理解线程同步(当然用共享数据通过Thread也可以实现同步)。
拿下面例子说
class MyThread implements Runnable{
private int ticket = 5 ;
public void run(){
for(int i=0;i<100;i++){
if(ticket>0){
try{
Thread.sleep(300) ; // 加入延迟
}catch(InterruptedException e){
e.printStackTrace() ;
}
System.out.println("卖票:ticket = " + ticket-- );
}
}
}
};
public class SyncDemo01{
public static void main(String args[]){
MyThread mt = new MyThread() ; // 定义线程对象
Thread t1 = new Thread(mt) ;
Thread t2 = new Thread(mt) ;
Thread t3 = new Thread(mt) ;
t1.start() ;
t2.start() ;
t3.start() ;
}
};
运行结果
卖票:ticket = 5
卖票:ticket = 3
卖票:ticket = 4
卖票:ticket = 2
卖票:ticket = 1
卖票:ticket = 0
发现票数出现了0,因为在run中加入了延迟,所以在--操作执行时或许另一个线程已经开始执行了,所以会出现票数不正常的情况。
所以我们要加入线程同步
synchronized(this){
if(ticket>0){
.........
}
}
这样一个线程在执行时,其他线程会挂起,所以可以实现正常卖票。
当然同步还可以同步方法,同步数据,并不一定是同步代码块。
比如public synchronized void sale(){}