簡體   English   中英

'nameList'變量是實例變量還是類變量? 為什么它不包含在'synchronized(this){}“語句中?

[英]Is the 'nameList' variable an instance variable or class variable? Why is it not included in the 'synchronised(this){}" statement?

我是Java新手,正在嘗試學習synchronized語句的概念。 下面的代碼和語句來自Java教程Oracle

我的問題是,'nameList'變量是實例變量還是類變量? 為什么它不包含在synchronised(this){}語句中? 我很難理解這個概念。

同步語句

創建同步代碼的另一種方法是使用synchronized語句。 與synchronized方法不同,synchronized語句必須指定提供內部鎖的對象:

 public void addName(String name) { synchronized(this) { lastName = name; nameCount++; } nameList.add(name); } 

在此示例中,addName方法需要將更改同步到lastName和nameCount,但還需要避免同步其他對象方法的調用。 (從同步代碼調用其他對象的方法可能會產生在Liveness部分中描述的問題。)如果沒有synchronized語句,則必須有一個單獨的,不同步的方法,其唯一目的是調用nameList.add。

'nameList'變量是實例變量還是類變量?

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

為什么它不包含在'synchronized(this){}“語句中?

因為必須假設nameList.add()已經是線程安全的,並且名稱添加到列表中不需要在與其他兩個指令相同的原子部分中進行。

但我同意這是一個很糟糕的例子。

這是一個更簡單的希望更清晰:

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

您希望以原子方式執行兩個第一條指令。 但是你不關心在這個原子操作之后發生日志記錄指令。 並且您希望在執行日志記錄指令時避免阻止其他線程獲取鎖定。 因此,同步塊非常有用:它使關鍵部分盡可能短。 使方法同步將使臨界區大於必要。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM