2016-02-18 54 views
1

我是新來的Java,並試圖瞭解同步語句的概念,代碼和下面的語句從Java tutorial Oracle出來。'nameList'變量是一個實例變量還是類變量?爲什麼不包含在「同步(本){}」語句?

我的問題是,是「名字列表」變量的實例變量或類變量?爲什麼不包含在synchronised(this){}聲明?我有很大的困難理解的概念。

同步報表

另一個創建同步代碼的方法是同步 聲明。不像同步方法的,同步的語句必須 指定提供固有鎖對象:

​​

在這個例子中,addName方法需要同步變化 lastName的和nameCount,還需要避免同步的 調用其他對象「的方法。 (從同步代碼中調用其他對象' 方法可能會產生在Liveness部分描述 的問題。)如果沒有同步語句,則 必須是單獨的,未同步的方法,用於調用nameList.add的唯一目的。

+1

您是否閱讀過「Liveness」部分? –

+1

它並沒有真正說出'nameList'是什麼,但大概這個調用不需要外部同步。本教程的要點是介紹'synchronized(monitor){}'語法,該語法允許從同步中排除部分方法(或者在除'this之外的任何其他同步方法)。所以他們只是提出這種情況,你有一些鎖不應該被覆蓋的方法的一部分(以避免活性問題)。 – Thilo

回答

3

是'nameList'變量的一個實例變量或類變量?

你並不需要知道。這是無關緊要的。

爲什麼不包含在「同步(本){}」語句

因爲它必須假定nameList.add()已經是線程安全的,並且加入名稱列表並不需要在相同的原子部分做成與其他兩個指令。

但我認爲,這是一個相當差的例子。

這裏有一個簡單的辦法就是希望更清晰:

public void addName(String name) { 
    synchronized(this) { 
     lastName = name; 
     nameCount++; 
    } 
    System.out.println("a name has been added"); 
} 

你想讓兩條第一條指令以原子方式執行。但是你不關心在這個原子操作之後發生日誌指令。並且您希望避免其他線程在執行日誌記錄指令時獲取鎖。同步塊因此非常有用:它使關鍵部分儘可能短。使方法同步會使關鍵部分大於所需。

相關問題