如果synchronized(new Object){} 和 Object obj = new Object(); synchronized(obj){}的區別是什麼? 主要是在synchronized()中放new Object 是四個線程一起,而放obj對象是一個一個的執行,這是什麼原因呢?
代碼:
class XianChengDemo {
public static void main(String[] args)
{
Card c = new Card();
Thread t = new Thread(c);
Thread t1 = new Thread(c);
Thread t2 = new Thread(c);
Thread t3 = new Thread(c);
t.start();
t1.start();
t2.start();
t3.start();
}}
class Card implements Runnable{
private static int cards = 100;
Object obj = new Object();
public void run()
{ while(true)
{ synchronized(obj)
{ if(cards>0)
{ try{Thread.sleep(10);}catch(Exception e){} System.out.println(Thread.currentThread().getName()+"------"+cards--);
}
else{
break;
}
}
} }}
第一種寫法使用的鎖監視器對象是臨時創建的,即每個線程運行到這段代碼時都會新建一個對象並以此為同步鎖,鎖不同當然不存在鎖競爭而等待問題,所以看到的是並行的。
第二個寫法同步塊對象是全局的成員變量,所有訪問這段代碼的線程使用的是同一個鎖監視器,所以有競爭等待。