您在 Java 中遇到的最常见的并发问题是什么?[已关闭]

2022-08-31 06:25:23

这是一个关于Java中常见并发问题的民意调查。一个例子可能是经典的死锁或争用条件,或者可能是 Swing 中的 EDT 线程错误。我既对各种可能的问题感兴趣,也对最常见的问题感兴趣。因此,请为每个评论留下一个Java并发错误的具体答案,如果您看到一个遇到的答案,请投票。


答案 1

我的#1最痛苦的并发问题发生在两个不同的开源库做这样的事情时:

private static final String LOCK = "LOCK";  // use matching strings 
                                            // in two different libraries

public doSomestuff() {
   synchronized(LOCK) {
       this.work();
   }
}

乍一看,这看起来像一个非常微不足道的同步示例。但是;因为字符串在 Java 中是滞留的,所以文本字符串结果是相同的实例(即使它们彼此声明完全不同)。结果显然很糟糕。"LOCK"java.lang.String


答案 2

我见过的最常见的并发问题是没有意识到由一个线程编写的字段不能保证被另一个线程看到。它的常见应用:

class MyThread extends Thread {
  private boolean stop = false;

  public void run() {
    while(!stop) {
      doSomeWork();
    }
  }

  public void setStop() {
    this.stop = true;
  }
}

只要停止不是易失性的或和不同步的,这就不能保证工作。这个错误特别魔鬼,因为在99.999%中,这在实践中并不重要,因为读者线程最终会看到变化 - 但我们不知道他多久就看到了它。setStoprun


推荐