Java:如何对数组元素进行双重检查锁定?

标签 java multithreading arrays synchronized double-checked-locking

这就是我的代码当前的样子:

private boolean[] isInitialized = new boolean[COUNT];

private void ensureInitialized(int i) {
    if (! isInitialized[i]) {
        initialize(i);
        isInitialized[i] = true;
    }
}

现在我想让它线程安全。我知道Java中的双重检查锁定是“teh 3vilness!!1”,但是由于ensureInitialized可能会被频繁调用,所以我不希望它被同步。所以我正在考虑这样做:

private boolean[] isInitialized = new boolean[COUNT];

private void ensureInitialized(int i) {
    if (! isInitialized[i]) {
        synchronized (this) {
            if (! isInitialized[i]) {
                initialize(i);
                isInitialized[i] = true;
            }
        }
    }
}

现在我必须做什么才能使其真正线程安全?
一些子问题:

  • 没有必要将 isInitialized 设为 volatile ,因为变量不会更改,对吧?
  • 数组元素已更改,如何使它们变为 volatile ?
  • 是否有更好的方法来做到这一点?

(另请注意,这是一个实例方法,因此静态初始化器将不起作用)

最佳答案

您还可以考虑使用Suppliers.memoize(Supplier<T> delegate)来自guava library .

关于Java:如何对数组元素进行双重检查锁定?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3897202/

相关文章:

java - 如何在我的 jsp 中使用 javascript 访问来自服务器的 java 列表

java - 问题 java.lang.IllegalStateException : zip file closed

java - boolean 字段上的 Aerospike 过滤器表达式不起作用

java - "VM Periodic Task Thread"是什么?

c++ - 原子增量正在刷新其他缓存行(提供的代码和结果)?

java - 尝试从 ArrayList 中为每个用户打印出来

PHP - 我可以将这个 if else 变成一个更干净的代码片段,例如数组和循环吗?

java - jetty 、 jackson 和 Jersey - 见解

apache-flex - 为什么 Flex 不支持线程?

c - 我如何在 c 中创建哈希表的动态数组