簡體   English   中英

將volatile和synchronized混合為讀寫鎖

[英]Mix volatile and synchronized as a read-write lock

考慮一個原始類型變量,其中包含許多線程讀取和幾個線程寫入,以下代碼是否可以正常工作?

如果它會,它提供比1)更好的性能。 聲明所有方法的同步; 2)。 使用顯式ReadWriteLock?

這是一種常見的模式嗎? 如果沒有,在這種情況下通常使用什么模式?

這對我來說當前工作正常,但我覺得使用volatile和synchronized有點多余。

private volatile int value = 1;

public void func1()
{
    if (value == 1) {
        // do something
    }
}

public void func2()
{
    if (value == 2) {
        // do something
    }
}

public void func3()
{
    if (value == 3) {
        // do something
    }
}

public synchronized void increase()
{
    if (value < 10) value++;
}

public synchronized void decrease()
{
    if (value > 0) value--;
}

是的,這是常見的,至少在一定程度上:)

您正在使用的模式在此IBM文章中進行了描述 - > http://www.ibm.com/developerworks/java/library/j-jtp06197/index.html

(模式#5,便宜的讀寫鎖技巧)

考慮一個原始類型變量,其中包含許多線程讀取和幾個線程寫入,以下代碼是否可以正常工作?

我認同。

如果它會,它提供比1)更好的性能。 聲明所有方法的同步; 2)。 使用顯式ReadWriteLock?

我認為是這樣,只要讀取操作超過寫入請求。 然而:

  • 除非這個反擊是高度爭議的,否則它可能並不重要。 除非你有證據證明它是(或將是)瓶頸,否則不要浪費你的時間進行微觀優化。
  • 如果它對你真的很重要,那就進行基准測試。
  • 如果相對性能取決於JVM版本/補丁級別,JVM選項和硬件,請不要感到驚訝; 例如處理器數量和存儲器架構。

這是一種常見的模式嗎? 如果沒有,在這種情況下通常使用什么模式?

我不知道這是否常見。 但我的直覺是,最常見的方法是只使用常規同步,而不用擔心它。 除非您正在處理高度競爭的數據結構,否則各種方法之間的性能差異對於整體應用程序性能來說無關緊要。

我確信它提供了更好的性能,因為沒有鎖定,但它是否正確取決於代碼的意圖。 當然,行為與同步的情況不同。 行為是否類似於鎖定案例取決於您鎖定的位置。

暫無
暫無

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

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