由于我正在编写一个专注于并发方面的分析器,所以我正在使用Java中的同步机制来寻找一个很好的人工例子。我的分析器使可见的一些与线程相关的操作;例如:
调用通知/等待
线程改变其状态
>一个线程与另一个线程竞争监视器锁
>一个线程在与另一个线程竞争之后已经获取了一个监视器锁
>衡量每种方法的执行时间
>哪个线程访问了一定的方法和频率
>等
所以我正在寻找,是一个Java程序,似乎是乍一看,但执行时,你开始怀疑结果。我希望我的分析器可能能够检测到在后台发生了什么。
为了弄清楚自己,我给你一个例子,Brian Goetz的Java并发实践书给出了用于学习原因的“有毒”代码示例。
@NotThreadSafe
public class ListHelper {
public List list =
Collections.synchronizedList(new ArrayList());
...
public synchronized boolean putIfAbsent(E x) {
boolean absent = !list.contains(x);
if (absent)
list.add(x);
return absent;
}
}
这是通过putIfAbsent方法来扩展一个线程安全的类。由于列表是同步的,而putIfAbsent使用另一个锁来保护状态作为列表中定义的方法。
分析器可以显示使用的监视器锁和用户的惊喜(或不…),用户将看到有两个可能的监视器锁而不是一个。
我不喜欢这个例子,但是我不会问,如果我已经有一堆很好的例子。
但是它们只是指断开的并发程序。我也在寻找线程安全的实现,但是它们并不明显是线程安全的。