[英]Thread Synchronization
我的程序中有2個線程,如下所示:
class SendThread implements Runnable {
public void run(){
Thread.sleep(1000);
while (true){
if (CONNECTION_ESTABLISHED){
// code here
}
}
}
}
class ReceiveThread implements Runnable {
public void run(){
while (true){
// code here
CONNECTION_ESTABLISHED = true;
}
}
}
我已將CONNECTION_ESTABLISHED
定義為static Boolean
。
在第二個線程中, Boolean
CONNECTION_ESTABLISHED
在特定點設置為true
。 如果我沒有在第一個線程中使用Thread.sleep(1000)
,那么在第二個線程中將CONNECTION_ESTABLISHED
設置為true
之后,我就不會在第一個線程中輸入相關的if
語句。
還有其他解決方法嗎? 因為我的第一個線程通常將依賴於第二個線程中的變量更改。
將volatile
關鍵字添加到CONNECTION_ESTABLISHED
方法中,然后查看。
您正面臨挑戰,因為您正在以非同步方式更改靜態變量CONNECTION_ESTABLISHED,並且沒有將等待通知機制用於線程通信。 使用等待通知應該可以為您提供幫助。 創建一個用於等待通知的對象,並使用以下代碼
class SendThread implements Runnable {
public void run(){
Thread.sleep(1000);
while (true){
synchronized(object) {
object.wait();
if (CONNECTION_ESTABLISHED){
// code here
}
}
}
}
}
class ReceiveThread implements Runnable {
public void run(){
while (true){
synchronized(object) {
// code here
CONNECTION_ESTABLISHED = true;
object.notify();
}
}
}
}
我沒有測試代碼,我只是嘗試提出概念,因此可以根據需要進行更改。
在此特定示例中,您可以將CONNECTION_ESTABLISHED布爾值標記為volatile,它將按預期工作,其他線程在下次訪問該變量時將看到更改。
但是,我警告您,除了最簡單的情況(單變量更新)以外,不要對任何其他東西使用volatile。 它沒有原子性,因此,如果您在更新過程中需要執行的任務不止一次,則不會提供必要的保證。 這包括增量/減量,實際上是3個操作,在內存模型級別讀取/修改/寫入,因此需要適當的同步。
在這種情況下,您應該在讀取和寫入周圍使用同步塊。
private final Object lock = new Object();
private int shared1;
private int shared2;
public void write(int var1, int var2)
{
sychronized (lock)
{
shared1 = var1;
shared2 = var2;
}
}
public int readSum()
{
sychronized (lock)
{
int total = shared1 + shared2;
return total;
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.