考虑一个带有大量线程读取和一些线程编写的原始类型变量,以下代码可以正常工作吗?

如果可以的话,它提供的性能比1)更好。声明所有方法同步; 2)。使用显式读取者?

这是常见的模式吗?如果没有,在这种情况下通常使用哪种模式?

目前,这对我来说很好,但是我觉得使用挥发性和同步有点多余。

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--;
}
有帮助吗?

解决方案

考虑一个带有大量线程读取和一些线程编写的原始类型变量,以下代码可以正常工作吗?

我认同。

如果可以的话,它提供的性能比1)更好。声明所有方法同步; 2)。使用显式读取者?

我认为是这样,只要阅读操作超过写作请求。然而:

  • 除非强烈争夺此计数器,否则可能没关系。除非您有证据表明它是(或将是)瓶颈,否则不要浪费时间微观优化的东西。
  • 如果对您来说真的很重要,请基准测试。
  • 如果相对性能取决于JVM版本 /补丁级别,JVM选项和硬件,请不要感到惊讶;例如,处理器和内存体系结构的数量。

这是常见的模式吗?如果没有,在这种情况下通常使用哪种模式?

我不知道这是否常见。但是我的直觉是,最常见的方法是只使用常规同步,而不必担心。除非您要处理高度争议的数据结构,否则各种方法之间的性能差异对整体应用程序性能微不足道。

其他提示

是的,至少在一定程度上很常见:)

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

(图案#5,便宜的读写锁定技巧)

我敢肯定,它可以提供更好的性能,因为没有锁定,但是它是否正确取决于代码的意图。可以肯定的是,行为与同步案例不同。该行为是否与锁定案例相似,取决于您锁定的位置。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top