簡體   English   中英

在這種情況下是否需要“易失性”關鍵字詞? (Java)

[英]Is the “volatile” keyword word needed in this instance? (Java)

我有以下代碼被初始化為類中的靜態變量:

public class MyXlet extends Xlet {
   boolean connected = false;
   ...

   void connect() {
      // some code goes here, starts a new thread
      MyXlet.connected = true;
   }

   void disconnect() {
      // some code goes here, the new thread is designed to terminate once connected is false;
      MyXlet.connected = false;
   }
}

假設我已經運行了connect方法,它將產生一個新線程。 Disconnect()方法將“ connected”設置為“ false”。 是否可以保證從connect()方法產生的線程將看到“ connected”不再等於“ true”? 還是我必須在“已連接”上使用volatile關鍵字? 值得注意的是,我正在使用Java 1.4.2。

是否可以保證從connect()方法產生的線程將看到“ connected”不再等於“ true”?

只有當這是從催生了螺紋connect()方法是設定一個connectedfalse

生成的線程在啟動后將能夠看到connected為真,因為啟動線程是“ 先發生”操作,並且源代碼也會在線程內進行排序之前建立“ 先發生”操作

但是,如果父線程在生成的線程上調用start() 之后清除connected標志,則除非保證將標志聲明為volatile否則不能保證生成的線程會看到更改。

1.4和1.5行為之間的主要區別在於,寫入volatile變量還將刷新從Java 5開始對非易失性變量的寫入。 (讀取易失性變量還會清除所有緩存的非易失性變量值。)由於似乎您只涉及一個變量,所以此更改不會影響您。

是的,您應該使用volatile。 這將確保在更新字段的值時,檢查該字段的所有線程都將具有更新的值。 否則,您將無法確保不同的線程將獲得更新后的值。

好吧,即使您沒有添加volatile關鍵字,其他線程也將能夠讀取連接的變量。 通過添加volatile等,您可以同步訪問變量。

暫無
暫無

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

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