因为我正在编写一个专注于并发方面的分析器,所以我正在寻找一个在中使用同步机制的很好的人工示例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;
}
}
这是一个线程安全类的扩展,方法是 putIfAbsent
。由于 list
是同步的,但是 putIfAbsent
使用另一个锁来保护列表上定义的方法的状态。
探查器可以显示已使用的监视器锁,并且令用户(或不......)惊讶的是,用户会看到有两个可能的监视器锁而不是一个。
我不太喜欢这个例子,但我不会问,如果我已经有一堆很好的例子。
我发现我的问题与此类似:What is the most frequent concurrency issue you've encountered in Java?和 Java concurrency bug patterns .
但它们仅指损坏的并发程序。我也在寻找线程安全的实现,但它们是线程安全的仍然不明显。
最佳答案
看看 list of FindBugs bug descriptions ,特别是属于多线程正确性类别的那些(右表列)。
这些错误中的每一个都包含关于为什么特定习语不好以及如何解决它的引用。
关于java - 寻找令人惊讶的并发 Java 程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6319555/