簡體   English   中英

Java同步對象?

[英]Java Synchronized Object?

我在java中有一個類,它讀取UDP數據包並將它們放在一個對象中(基本上是無限循環)。 然后在多個單獨的線程中訪問此對象,但顯然,由於它是同時填充的,因此所有這些getter / setter都采用同步方法。 問題是,現在這些getter有這樣的代碼:

public synchronized SomeObject exampleGetter() {
    if(this.isReceiving)
        return oldCachedObject;
    else
        return currentObject;
}

顯然,這不是最好的處理方式,所以我應該如何編寫方法(許多不同的方法),將對象完全鎖定到一個線程並阻塞其他線程(包括創建對象的線程)第一名)? 我看了一下synchronized塊,但是我對於“鎖定對象”有什么影響感到困惑,是那個在給定時間可以訪問塊的對象? 任何意見,將不勝感激。 謝謝!

synchronized關鍵字在整個對象實例上同步,而不僅僅是setter。 我寧願選擇細粒度鎖定策略或更好...使用線程安全數據結構來存儲和獲取接收到的數據。 我個人喜歡BlockingQueue<T> ,其中T是您在網絡上收到的數據類型。

假設您正在通過套接字接收Object

public class ReceivedDataHolder{
    BlockingQueue<Object> dataBuffer = new LinkedBlockingQueue<Object>();
    //...
    public void dataReceived(Object data){
       dataBuffer.offer(data);
    } 

    public Object getReceivedData(){
       return dataBuffer.take();
    }
}

在您的套接字中,您可以在收到數據時執行此操作:

receivedDataHolder.dataReceived(object);

任何想要獲取數據的線程應該:

receivedDataHolder.getReceivedData();

后一個方法調用將阻塞調用線程,直到隊列中有一個元素可用(請查看更多詳細信息)

我希望這有幫助

java中的所有對象都有一些稱為內部鎖的東西,如果任何線程想要對任何對象執行任何操作,那么它需要獲取該對象的內部鎖。 它將保證在任何給定時間只有一個線程將處理您的代碼塊。

線程可以獲取任何對象的鎖定,如果該對象未被任何其他線程鎖定,如果它被鎖定,則該線程將等待,直到另一個線程釋放該對象上的鎖定。

如果您使用synchronized塊,您的代碼將有點像這樣

public void SomeObject exampleGetter() {

synchronized(this)
{


if(this.isReceiving)
        return oldCachedObject;
    else
        return currentObject;


}

在這種情況下,當您的線程進入同步塊時,如果任何其他線程鎖定此對象,則它將等待該線程釋放鎖定。 如果該對象是空閑的,那么您的線程將獲取此對象上的鎖並執行操作,然后釋放該對象上的鎖。

有關同步塊,方法和內部鎖的更多信息,請參閱http://docs.oracle.com/javase/tutorial/essential/concurrency/locksync.html

我希望它能幫助你:)

暫無
暫無

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

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