標籤:
首先,來看一段代碼。
1 public class PersonSet { 2 3 private final Set<Person> mySet = new HashSet<Person>(); 4 5 public synchronized void add(Person p){ 6 mySet.add(p); 7 } 8 9 public synchronized boolean contains(Person p){10 return mySet.contains(p);11 }12 13 class Person{}14 }
此段代碼出自java並發編程,書上寫這段代碼是安全執行緒的。按照我之前的理解,我認為不是安全執行緒的。
下面展示一下我錯誤觀點的思路:
假如有 Personset personA = new PersonSet(); Thread threadA、threadB 。threadA裡面調用 對象personA的contains()方法,threadB調用對象personA的add()方法,這個時候不就是不安全的嗎。
--------------------------------
問題就出現在這兒,在方法前加 synchronized 關鍵詞實際上是給該對象加上了對象鎖,也就是說當前對象執行該方法到時候必須要擷取到當前對象的鎖,才能繼續執行。一個對象的鎖,在一個時刻只能被一個
線程擷取。也就是說當線程A佔有著對象personA的鎖的時候,線程B是拿不到personA的鎖的,那麼它也就不能執行對象personA的synchronized 方法,因此該段代碼是安全執行緒的。
既然提到了這個話題,就接著往下面扯一點兒。
上面的代碼當線程threadA在執行對象personA的add方法的時候,線程B不能再執行personA的add方法,因為它沒有該對象的鎖。此時,線程B雖然不能執行personA的add方法,但是它可以執行 personSet
psersonB的add方法。
--待續--
java對象鎖&類鎖