[英]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()
方法是設定一個connected
到false
!
生成的線程在啟動后將能夠看到connected
為真,因為啟動線程是“ 先發生”操作,並且源代碼也會在線程內進行排序之前建立“ 先發生”操作 。
但是,如果父線程在生成的線程上調用start()
之后清除connected
標志,則除非保證將標志聲明為volatile
否則不能保證生成的線程會看到更改。
1.4和1.5行為之間的主要區別在於,寫入volatile
變量還將刷新從Java 5開始對非易失性變量的寫入。 (讀取易失性變量還會清除所有緩存的非易失性變量值。)由於似乎您只涉及一個變量,所以此更改不會影響您。
是的,您應該使用volatile。 這將確保在更新字段的值時,檢查該字段的所有線程都將具有更新的值。 否則,您將無法確保不同的線程將獲得更新后的值。
好吧,即使您沒有添加volatile關鍵字,其他線程也將能夠讀取連接的變量。 通過添加volatile等,您可以同步訪問變量。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.