Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 混合volatile和synchronized作为读写锁_Java_Concurrency_Volatile_Synchronized_Readwritelock - Fatal编程技术网

Java 混合volatile和synchronized作为读写锁

Java 混合volatile和synchronized作为读写锁,java,concurrency,volatile,synchronized,readwritelock,Java,Concurrency,Volatile,Synchronized,Readwritelock,考虑一个原语类型变量,有很多线程在读,有几个线程在写,下面的代码能正常工作吗 如果会,它是否比1)提供更好的性能。在所有方法上声明已同步;2). 使用显式读写锁 这是一种常见的模式吗?如果不是,在这种情况下通常使用什么模式 目前这对我来说很好,但我觉得同时使用volatile和synchronized有点多余 private volatile int value = 1; public void func1() { if (value == 1) { // do som

考虑一个原语类型变量,有很多线程在读,有几个线程在写,下面的代码能正常工作吗

如果会,它是否比1)提供更好的性能。在所有方法上声明已同步;2). 使用显式读写锁

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

目前这对我来说很好,但我觉得同时使用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--;
}
private volatile int value=1;
公共图书馆1(
{
如果(值==1){
//做点什么
}
}
公共图书馆2(
{
如果(值==2){
//做点什么
}
}
公共图书馆3(
{
如果(值==3){
//做点什么
}
}
公共空间增加()
{
如果(值<10)值++;
}
公共空间减少()
{
如果(值>0)值--;
}

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

考虑一个原语类型变量,有很多线程在读,有几个线程在写,下面的代码能正常工作吗

我想是的

如果会,它是否比1)提供更好的性能。在所有方法上声明已同步;2). 使用显式读写锁

我想是的,前提是读操作的数量超过写请求。然而:

  • 除非这个计数器很有竞争力,否则它可能无关紧要。除非你有证据证明某件事是(或将是)瓶颈,否则不要浪费时间进行微优化
  • 如果这对你来说真的很重要,那么对它进行基准测试
  • 如果相对性能取决于JVM版本/补丁级别、JVM选项和硬件,不要感到惊讶;e、 g.处理器数量和内存架构
这是一种常见的模式吗?如果不是,在这种情况下通常使用什么模式


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

是的,这是常见的,至少在某种程度上是如此:)

您正在使用的模式在这篇IBM文章中有描述->


(pattern#5,廉价的读写锁技巧)

+1篇优秀的文章,对于想更好地理解volatile的人来说是“必读”阅读volatile锁和synchronized锁让我想,为什么我们不需要两者?若我只使用同步setter和getter,而不将变量设置为volatile,那个么操作将是原子的,但我如何确保线程看到的是实际值而不是CPU缓存中的值呢?