寻找一个令人惊讶的并发Java程序
2022-09-03 01:36:00
由于我正在编写一个专注于并发方面的探查器,因此我正在寻找一个在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
探查器可以显示使用的监视器锁,并且令用户惊讶的是(或不...),用户会看到有两个可能的监视器锁而不是一个。
我不太喜欢这个例子,但我不会问,如果我已经有很多好的例子。
我发现我的问题与此类似:您在Java中遇到的最常见的并发问题是什么?以及Java并发错误模式。
但它们仅指损坏的并发程序。我也在寻找线程安全的实现,但是它们是否线程安全仍然不明显。