java對象鎖&類鎖

來源:互聯網
上載者:User

標籤:

首先,來看一段代碼。

 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對象鎖&類鎖

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.