【发布时间】:2017-10-24 09:11:09
【问题描述】:
我在 Peter Lawry 的博客 here 上找到了此代码。他提到这个类不需要任何进一步的同步。
我正在努力提高我对并发性以及如何避免不必要的同步的了解,因此我试图从 java 内存模型的角度来了解如何推理这种情况。
对字符串数组的引用是最终的,字符串本身是不可变的,但对包含在数组中的字符串的引用是可变的
- 在另一个线程更新值后,一个线程仍然可以看到 null 至少在理论上不是可能的吗?
- 或者是不是我们不在乎字符串是否被多次实习?
-
或者 JVM 是否提供了一些我缺少的额外保证?
public class StringInterner { private final String[] interner; private final int mask; public StringInterner(int capacity) { int n = Maths.nextPower2(capacity, 128); interner = new String[n]; mask = n - 1; } private static boolean isEqual(@Nullable CharSequence s, @NotNull CharSequence cs) { if (s == null) return false; if (s.length() != cs.length()) return false; for (int i = 0; i < cs.length(); i++) if (s.charAt(i) != cs.charAt(i)) return false; return true; } @NotNull public String intern(@NotNull CharSequence cs) { long hash = 0; for (int i = 0; i < cs.length(); i++) hash = 57 * hash + cs.charAt(i); int h = (int) Maths.hash(hash) & mask; String s = interner[h]; if (isEqual(s, cs)) return s; String s2 = cs.toString(); return interner[h] = s2; } }
【问题讨论】:
标签: java concurrency thread-safety