小编Con*_*hai的帖子

使用 for(boolean haveNext = false;;) 而不是 while(cond)

这是来自的代码片段AtomicInteger

public final int accumulateAndGet(int x,
                                  IntBinaryOperator accumulatorFunction) {
    int prev = get(), next = 0;
    for (boolean haveNext = false;;) {
        if (!haveNext)
            next = accumulatorFunction.applyAsInt(prev, x);
        if (weakCompareAndSetVolatile(prev, next))
            return next;
        haveNext = (prev == (prev = get()));
    }
}
Run Code Online (Sandbox Code Playgroud)

是否有任何特定原因使用for(...而不是while(...或者它只是一个编程选择?

是因为jvm进行了重新排序吗?

java concurrency multithreading java-8

6
推荐指数
1
解决办法
138
查看次数

Cloneable#clone 方法不必要的强制转换

class MyCls implements Cloneable {
  @Override
  protected MyCls clone() throws CloneNotSupportedException {
    return new MyCls(//...
  }
}
Run Code Online (Sandbox Code Playgroud)

上面的代码没有任何问题。那么为什么CopyOnWriteArrayList#clone返回一个Object而不是CopyOnWriteArrayList?从转换回Object所需类型时,编译器会哭。毕竟,这个设计决定的原因是什么?我看到整个图书馆都在重复这种模式。

Ralph建议下面的代码是有效的,而不是上面的代码:

@Override MyCls clone() throws CloneNotSupportedException { 
  MyCls clone = (MyCls)super.clone();
  clone.x = this.x; //or what ever to do return clone
  // ...
}
Run Code Online (Sandbox Code Playgroud)

问题还是一样。为什么CopyOnWriteArrayList#clone返回Object而不是它自己?

java java-8

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

compareAndExchange 与 compareAndExchangeAcquire 有什么区别

这是 Java 库中的一个片段:

public final boolean compareAndExchangeAcquire(boolean expectedValue, boolean newValue) {
    return (int)VALUE.compareAndExchangeAcquire(this,
                                                (expectedValue ? 1 : 0),
                                                (newValue ? 1 : 0)) != 0;
}
Run Code Online (Sandbox Code Playgroud)

它来自AtomicBoolean课堂。演员怎么能int返回一个boolean

我的主要问题:compareAndExchangevs之间有什么区别compareAndExchangeAcquire


通俗地说:在申请之前xxxAcquire和之后写的语句xxxRelease可以自由重新排序xxx

在此处输入图片说明

java concurrency java-14

0
推荐指数
1
解决办法
292
查看次数

标签 统计

java ×3

concurrency ×2

java-8 ×2

java-14 ×1

multithreading ×1