創建同步方法之後,這個同步代碼塊使用的鎖就是當前對象
package thread;
/*
同步函數用的是哪一個鎖呢?
函數需要被對象調用。那麼函數都有一個所屬對象引用。就是this。所以同步函數使用的鎖是this。
通過該程序進行驗證。
使用兩個線程來買票。
一個線程在同步代碼塊中。
一個線程在同步函數中。
都在執行買票動作。
*/
public class Thread_4_SynMethodDemo2 {
public static void main(String[] args)
{
Ticket3 t = new Ticket3();
Thread t1 = new Thread(t);
Thread t2 = new Thread(t);
t1.start();
try{Thread.sleep(100);}catch(Exception e){}
t.flag = false;
t2.start();
}
}
class Ticket3 implements Runnable{
private int tick = 100;
Object obj = new Object();
boolean flag = true;
public void run(){
if(flag){
while(true) {
synchronized(this){ //設置成這樣子就喝同步方法一樣了
//synchronized(obj){ //設置成這樣的話會導致可能的危險(0會出現)
if(tick>0){
try{Thread.sleep(10);}catch(Exception e){}
System.out.println(Thread.currentThread().getName()+"....code : "+ tick--);
}
}
}
}
else
while(true)
show();
}
public synchronized void show(){//這裏的鎖是this
if(tick>0){
try{Thread.sleep(10);}catch(Exception e){}
System.out.println(Thread.currentThread().getName()+"....show.... : "+ tick--);
}
}
}