簡體   English   中英

線程同步

[英]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.

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