寻找一个令人惊讶的并发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;
    }
}

这是通过方法作为线程安全类的扩展。因为 是同步的,但使用另一个锁来保护状态,如列表中定义的方法。putIfAbsentlistputIfAbsent

探查器可以显示使用的监视器锁,并且令用户惊讶的是(或不...),用户会看到有两个可能的监视器锁而不是一个。

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


我发现我的问题与此类似:您在Java中遇到的最常见的并发问题是什么?以及Java并发错误模式

但它们仅指损坏的并发程序。我也在寻找线程安全的实现,但是它们是否线程安全仍然不明显。


答案 1

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

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


答案 2

我会回到过去,大概七年或更长时间,找到一些java.util.concurrent之前的开源代码。几乎任何滚动自己的并发性的东西都会有一些微妙的错误,因为并发性很难正确。


推荐