寻找一个令人惊讶的并发Java程序

Kon*_*che 17 java concurrency multithreading

自从我写一个分析器注重并发方面,我要寻找使用好的人造例如同步机制的Java.我的探查器可以看到与线程相关的一些操作; 例如:

  • 呼叫通知/等待
  • 线程改变其状态
  • 一个线程与另一个线程争用一个监视器锁
  • 在与另一个竞争之后,线程已获取监视器锁定
  • 测量每种方法的执行时间
  • 哪个线程访问了某种方法以及访问频率
  • 等等

所以我正在寻找的是一个Java程序,乍一看似乎是理解的,但在执行它时,你开始怀疑结果.我希望我的探查器可能能够检测到后台发生了什么.


为了澄清自己,我举一个例子,Brian Goetz撰写的Java Concurrency in Practice一书给出了"有毒"代码示例,这些示例用于学习原因.

@NotThreadSafe
public class ListHelper<E> {
    public List<E> list =
        Collections.synchronizedList(new ArrayList<E>());
    ...
    public synchronized boolean putIfAbsent(E x) {
        boolean absent = !list.contains(x);
        if (absent)
            list.add(x);
        return absent;
    }
}
Run Code Online (Sandbox Code Playgroud)

这是通过该方法的线程安全类的扩展putIfAbsent.由于list是同步的,但putIfAbsent使用另一个锁来保护状态,就像列表中定义的方法一样.

分析器可以显示使用过的监视器锁和用户的惊讶(或者不是......),用户会看到有两个可能的监视器锁而不是一个.

我不太喜欢这个例子,但我不会问,如果我已经有很多好的例子了.


我发现我的问题类似于:你在Java中遇到的最常见的并发问题是什么?Java并发错误模式.

但他们只提到破坏的并发程序.我也在寻找线程安全的实现,但仍然不明显它们是线程安全的.

min*_*das 11

查看FindBugs错误描述列表,特别是属于多线程正确性类别的那些(右表列).

这些错误中的每一个都包含有关特定习语为什么不好以及如何解决的参考.