2010-11-27 70 views
7

考虑一个原始类型变量,其中有大量线程读取和一些线程写入,以下代码是否可以正常工作?混合易失性并同步为读写锁

如果会,它会提供比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--; 
} 

回答

3

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

我这么认为。

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

我这么认为,只要读操作超过写请求。但是:

  • 除非此计数器高度竞争,否则可能无关紧要。除非你有证据证明它是(或者将会)是一个瓶颈,否则不要浪费时间微观优化某些东西。
  • 如果它真的对你很重要,请将它作为基准。
  • 如果相对性能取决于JVM版本/补丁级别,JVM选项和硬件,请不要感到惊讶;例如处理器数量和内存架构。

这是常见模式吗?如果不是,这种情况通常使用什么样的模式?

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

0

我相信它提供了更好的性能,因为没有锁定,但是否正确取决于代码的意图。当然,这种行为与同步案例不同。行为是否与锁定案例相似取决于您锁定的位置。