java - 这里需要 volatile 吗?

标签 java arrays synchronization volatile primitive

在以下假设场景中,出于更好地理解语言的愿望,int[] 引用是否需要 volatile?

public final class SO {

    private int[] ar = new int[10];  // is volatile needed here?
    private int idx = 0;

    public synchronized int get( int i ) {
        return ar[i];
    }

    public synchronized void append( final int val ) {
        if ( idx == ar.length ) {
            // array is too small, let's grow it
            final int[] prev = ar;
            ar = new int[ar.length+ar.length*20/100]
            System.arrayCopy(prev, 0, ar, 0, prev.length);
        }
        ar[idx++] = val;
    }

}

检索 int 的唯一方法是通过 synchronized 方法和修改 int[] 的唯一方法(包括创建new int[]) 也是通过同步方法完成的。

我不需要添加任何额外的同步吗?

最佳答案

不,不需要 volatile 因为它只能在同步方法中访问,所以它已经是线程安全的。您的代码中不需要进一步的线程安全。

关于java - 这里需要 volatile 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8928868/

相关文章:

c++ - 未排序数组上 cpp 中 lower_bound 的行为

java - 三重缓冲区严重闪烁

java - 如何从java中的.eml文件获取内部主题

java - 在 Spring MVC 中自定义 DispatcherServlet 是一种常见的做法吗?

java - 使用同步块(synchronized block)的锁

java:同步方法效率低下

java - 持续执行应用程序

java - 未调用 paintComponent

c - 斐波那契数列错误 C

C: 将接收到的 Winsock 数据包保存为十六进制文件