相关疑难解决方法(0)

在Java JVM中重新排序的说明

我正在阅读这篇博文.

作者正在谈论在多线程环境中打破hashCode()in String.

有了:

public int hashCode() {
     int h = hash;
     if (h == 0) {
         int off = offset;
         char val[] = value;
         int len = count;

         for (int i = 0; i < len; i++) {
             h = 31*h + val[off++];
         }
         hash = h;
     }
     return h;
 }
Run Code Online (Sandbox Code Playgroud)

变成:

public int hashCode() {
     if (hash == 0) {
         int off = offset;
         char val[] = value;
         int len = count;

         int …
Run Code Online (Sandbox Code Playgroud)

java concurrency

30
推荐指数
1
解决办法
3796
查看次数

Guava中使用的无锁延迟加载模式是否真的是线程安全的?

一些Guava内部类型,例如AbstractMultiset,有这样的模式:

private transient Set<E> elementSet;

@Override
public Set<E> elementSet() {
  Set<E> result = elementSet;
  if (result == null) {
    elementSet = result = createElementSet();
  }
  return result;
}

Set<E> createElementSet() {
  return new ElementSet();
}
Run Code Online (Sandbox Code Playgroud)

我们的想法是延迟创建集合视图(elementSet(),entrySet()),直到实际需要它们为止.进程周围没有锁定,因为如果两个线程同时调用elementSet(),则可以返回两个不同的值.编写该elementSet字段会有竞争,但由于写入引用字段在Java中始终是原子的,因此谁赢得竞争并不重要.

但是,我担心Java内存模型在这里内联的内容.如果createElementSet()ElementSet的构造函数都被内联,似乎我们可以得到这样的东西:

@Override
public Set<E> elementSet() {
  Set<E> result = elementSet;
  if (result == null) {
    elementSet = result = (allocate an ElementSet);
    (run ElementSet's constructor);
  }
  return result;
}
Run Code Online (Sandbox Code Playgroud)

这将允许另一个线程观察到一个非null但未完全初始化的值 …

java lazy-loading java-memory-model guava

15
推荐指数
1
解决办法
458
查看次数

Java中哈希码的延迟初始化

为什么说不可变对象使用惰性哈希码初始化呢?对于可变对象也是如此,我们只能在需要时才计算哈希码,这会导致延迟初始化吗?

java initialization hashcode lazy-evaluation

2
推荐指数
1
解决办法
519
查看次数