物件鎖,顧名思義是鎖住物件,不同例項的鎖互不影響。
物件鎖有兩種加鎖的方式,主要卻在於synchronized作用的地方的不同
1.作用在例項方法上
public synchronized void method(){}
2.作用在**塊上
public void method()
}
持有相同物件鎖的地方會出現互斥:
public synchronized void method1() catch (interruptedexception e) }}
public synchronized void method2() catch (interruptedexception e) }}
public static void main(string args)
}).start();
new thread(new runnable()
}).start();
}
執行結果:
thread-0持有了物件鎖
thread-0持有了物件鎖
thread-0持有了物件鎖
thread-0持有了物件鎖
thread-0持有了物件鎖
thread-0持有了物件鎖
thread-0持有了物件鎖
這裡的執行結果實際上陷入了死迴圈。因為我設定了while(ture),可以看到,thread-0持有了當前物件的鎖之後,就會排斥持有相同物件鎖的執行緒。
synchronized修飾在例項方法上,代表著這裡鎖的是當前物件this.
那麼對於不同的物件,將不會產生相互影響:
public static void main(string args)
}).start();
new thread(new runnable()
}).start();
}
執行結果:
thread-0持有了物件鎖
thread-1持有了物件鎖
thread-0持有了物件鎖
thread-1持有了物件鎖
thread-0持有了物件鎖
thread-1持有了物件鎖
可以看到持有不同物件鎖的執行緒互不影響。
synchronized(object){}
的效果和在例項方法上加鎖一樣,不同的是可以在()裡新增不同的物件,例如:
synchronized(object1){}
synchronized(object2){}
當括號裡的物件是一樣時,表示持有的是同一物件鎖,反之,就不是同一物件鎖,那麼執行緒呼叫時互不干擾。
當synchronized(object){}
()中的物件與例項方法上鎖的是同一物件,那麼將會互斥。例如:
public synchronized void method(){}
public void method()
這裡,都代表鎖的是當前類的物件,所持有的鎖是同一把。
不管多少物件都共用同一把鎖,同步執行,乙個執行緒執行結束、其他的才能夠呼叫同步的部分
也是有兩種不同的加鎖方式。不同的類鎖互不影響
1.用synchronized修飾靜態方法
public synchronized static void method()
2.作用在**塊上
public void method()
}
當持有類鎖時,所有例項呼叫這個方法上都會互相排斥。
public synchronized static void staticmethod1() catch (interruptedexception e) }}
public synchronized static void staticmethod2() catch (interruptedexception e) }}
public static void main(string args)
}).start();
new thread(new runnable()
}).start();
}
執行結果:
thread-0持有了類鎖
thread-0持有了類鎖
thread-0持有了類鎖
thread-0持有了類鎖
thread-0持有了類鎖
thread-0持有了類鎖
可以看到,雖說呼叫的是不同物件的同步方法,但還是產生了互斥。
物件鎖和類鎖會互斥嗎?
//物件鎖
public synchronized void method1() catch (interruptedexception e) }}
//類鎖
public synchronized static void staticmethod1() catch (interruptedexception e)
}}
new thread(new runnable()
}).start();
new thread(new runnable()
}).start();
}
執行結果:
thread-0持有了物件鎖
thread-1持有了類鎖
thread-0持有了物件鎖
thread-1持有了類鎖
thread-0持有了物件鎖
thread-1持有了類鎖
可以看到物件鎖和類鎖互不影響。 類鎖和物件鎖
物件鎖 當乙個物件中有synchronized method或synchronized block的時候呼叫此物件的同步方法或進入其同步區域時,就必須先獲得物件鎖。如果此物件的物件鎖已被其他呼叫者占用,則需要等待此鎖被釋放 同步靜態方法 靜態變數互斥體 由於乙個class不論被例項化多少次,其中的靜...
類鎖和物件鎖
類鎖 和 物件鎖 1.類鎖 先定義這麼乙個類 classt synchronized static methoda 那麼 例項化兩個物件之後 classt a classt b 在這兩個物件呼叫methoda時,第乙個呼叫的會得到classt類的類鎖,第二個呼叫的要等到第乙個呼叫結束後釋放鎖,才能完...
類鎖和物件鎖的詳解
最近在面試中遇到很多關於多執行緒的問題,特別是鎖的應用,現在我就來說說類鎖和物件鎖。物件鎖 synchronized method 和類鎖 static sychronized method 的區別 物件鎖也叫例項鎖,對應synchronized關鍵字,當多個執行緒訪問多個例項時,它們互不干擾,每個...