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