相关疑难解决方法(0)

224
推荐指数
11
解决办法
9万
查看次数

什么时候最好在Java而不是AtomicBoolean中使用volatile boolean?

我已经查看了SO中的其他volatile和Atomicxxxx问题(包括这个),并阅读了java.util.current.atomic的描述,我对细微差别不太满意.

如果我在尝试使用volatile boolean和之间做出决定AtomicBoolean,除了AtomicBoolean提供的原子读取 - 修改 - 写入操作之外是否存在实际差异?(例如compareAndSet()getAndSet())

假设我有

volatile boolean flag;
Run Code Online (Sandbox Code Playgroud)

然后一个或多个线程设置标志(但不清除它).如果我有一个线程读取标志,如果设置,执行操作,然后清除标志,是否volatile足够?

AtomicBoolean的成本是否高于volatile布尔值

  • 记忆空间
  • 性能命中(volatile boolean似乎需要内存防护,AtomicBoolean似乎需要内存防护+根据java.util.current.atomic描述对CAS操作进行一些小锁定)

我的直觉调用是使用AtomicBoolean并且是安全的,但我想了解是否有任何情况可以使用volatile boolean(例如,如果我有数千个实例,性能是一个问题).

java concurrency atomic volatile

54
推荐指数
4
解决办法
2万
查看次数

我们如何在 main 方法中通过其他方法更新布尔值

请忽略格式和句子相关问题。

class ABC 
{   
 public void change(Boolean x, Boolean y, StringBuffer s)
 {
    x=true;
    y=true;
    s.append("vinay");
 }

 public static void main(String a[])
 {
    Boolean x = false;
    Boolean y = false;
    x=false;
    y=false;
    StringBuffer s = new StringBuffer();
    s.append("jasi");
    ABC p= new ABC();
    p.change(x,y,s);

    System.out.println(x);
    System.out.println(y);
    System.out.println(s);      
 }
}
Run Code Online (Sandbox Code Playgroud)

我想获得我在 main() 方法中对布尔 x,y 的 change() 方法所做的所有更改,因为我们在 main 函数中修改了 s。有什么方法可以让我们在 main 方法中获得修改后的值。

java

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

AtomicBoolean真的实现了原子性吗?

我理解AtomicInteger的有效用例,但我对AtomicBoolean如何保证,保证两个动作的原子性i.'改变布尔值'和ii.在以下经常引用的AtomicBoolean变量atomicInitialized的用例中执行'one-time-logic',例如initialize():

if (atomicInitialized.compareAndSet(false, true)) {
    initialize();
}
Run Code Online (Sandbox Code Playgroud)

此操作将首先将atomicInitialized设置为true(如果为false),然后执行不安全的intialize().它将保证initialize()仅被调用一次,但是第一个线程完成初始化之后,第二个调用getAndSet()的线程不会被延迟.因此,AtomicBoolean虽然在更新布尔值时提供原子性,但并不真正为整个'if-block'提供原子性,并且必须使用同步/锁定机制来实现完整的原子性.因此,上面经常引用的流行用例并不是真正的原子!!

java multithreading atomicity

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