相关疑难解决方法(0)

为什么在布尔值上同步不是一个好习惯?

我的建筑师总是说

永远不要在布尔上同步

我无法理解其中的原因,如果有人可以用一个例子来解释为什么它不是一个好的做法,我会非常感激. 参考样本代码

private Boolean isOn = false;
private String statusMessage = "I'm off";
public void doSomeStuffAndToggleTheThing(){

   // Do some stuff
   synchronized(isOn){
      if(isOn){
         isOn = false;
         statusMessage = "I'm off";
         // Do everything else to turn the thing off
      } else {
         isOn = true;
         statusMessage = "I'm on";
         // Do everything else to turn the thing on
      }
   }
}
Run Code Online (Sandbox Code Playgroud)

java multithreading boolean synchronize

33
推荐指数
2
解决办法
3万
查看次数

为什么java.util.concurrent.ArrayBlockingQueue使用'while'循环而不是'if'来调用await()?

我一直在玩我自己的版本,使用'if',似乎一切正常.当然,如果使用signalAll()而不是signal(),这将会崩溃,但如果一次只通知一个线程,那怎么会出错呢?

他们的代码在这里 - 检查put()和take()方法; 可以在JavaDoc for Condition的顶部看到更简单,更多点的实现.

我的实施的相关部分如下.

public Object get() {
    lock.lock();
    try {
        if( items.size() < 1 )
            hasItems.await();
        Object poppedValue = items.getLast();
        items.removeLast();
        hasSpace.signal();
        return poppedValue; 
    } catch (InterruptedException e) {
        e.printStackTrace();
        return null;
    } finally {
        lock.unlock();
    }
}

public void put(Object item) {
    lock.lock();
    try {
        if( items.size() >= capacity )
            hasSpace.await();
        items.addFirst(item);
        hasItems.signal();
        return;
    } catch (InterruptedException e) {
        e.printStackTrace();
    } finally {
        lock.unlock();
    }
}
Run Code Online (Sandbox Code Playgroud)

PS我知道,一般来说,特别是在像这样的lib类中,应该让异常渗透.

java concurrency multithreading

13
推荐指数
2
解决办法
2336
查看次数

标签 统计

java ×2

multithreading ×2

boolean ×1

concurrency ×1

synchronize ×1