如何使用Java检测同步冲突

如何使用Java检测同步冲突,java,multithreading,synchronization,error-detection,Java,Multithreading,Synchronization,Error Detection,我想知道有什么好方法可以对同步或其他东西进行断言,以便我可以检测到同步冲突(在测试时) 例如,我有一个不是线程安全的类,它也不会是线程安全的。以某种方式,我会有一些断言,如果从多个线程调用它的某些方法,它会通知我(日志或其他) 我渴望能为AWT调度线程提供类似的功能,包括: public static void checkDispatchThread() { if(!SwingUtilities.isEventDispatchThread()) { throw new R

我想知道有什么好方法可以对同步或其他东西进行断言,以便我可以检测到同步冲突(在测试时)

例如,我有一个不是线程安全的类,它也不会是线程安全的。以某种方式,我会有一些断言,如果从多个线程调用它的某些方法,它会通知我(日志或其他)

我渴望能为AWT调度线程提供类似的功能,包括:

public static void checkDispatchThread() {
    if(!SwingUtilities.isEventDispatchThread()) {
        throw new RuntimeException("GUI change made outside AWT dispatch thread");
    }
}

我只想要更一般的。问题描述不是很清楚,但我希望有人有一些好的方法=)

对于您给出的特定示例,SwingLabs有一些帮助代码来检测事件线程冲突和挂起


不久前,我使用了JProbeJava评测工具。他们的一个工具(ThreadAnalyzer?)查找线程同步冲突。看看他们的网页,我没有看到一个工具的名称或完全是我所记得的。但你可能想看看

我想你在寻找圣杯。据我所知,它并不存在,Java也不是一种允许轻松创建这种方法的语言


“实践中的Java并发性”有一节介绍线程问题的测试。它特别提请注意这是多么困难。

当Java中的线程出现问题时,它通常与死锁检测有关,而不仅仅是监视哪些线程同时访问同步部分。从1.5版开始添加到JRE的扩展可以帮助您检测这些死锁。事实上,我们在自己的软件中使用JMX来自动检测发现死锁的跟踪


下面是一个关于如何使用它的示例。

以及@Fernando提到的线程死锁,多线程的另一个问题是并发修改及其可能导致的问题

Java在内部做的一件事是,集合类记录它被更新的次数。然后,迭代器根据创建interator时的值检查every.next()上的值,以查看在迭代时集合是否已更新。我认为这个原则可以更广泛地使用。

试试看

这两种工具都分析代码,找出哪些部分的数据可以在线程之间共享,然后对代码进行检测(向编译的类中添加额外的字节码),以检查当两个线程试图同时更改某些数据时,代码是否中断。然后,这两个线程被反复运行,每次以稍微不同的时间偏移量启动它们,以获得许多可能的访问模式组合


另外,检查这个问题:

您可以使用或深入检查线程状态

您可能对Peter Veentjer在博客中提到的一种方法感兴趣,他称之为。我不相信他已经公开了这一点,但正如他所描述的,基本思想是使用AOP对您感兴趣的代码进行评测,并记录哪个线程触及了哪个字段。之后,需要手动或自动解析生成的日志

如果您能够识别线程不安全的类,静态分析可能会告诉您它们是否曾经“逃逸”到多个线程可见。通常情况下,程序员在头脑中会这样做,但很明显,他们在这方面很容易出错。工具应该能够使用类似的方法

也就是说,从您描述的用例来看,这听起来像是记住一个线程并对其进行断言这样简单的事情,可能足以满足您的需要

class Foo {

  private final Thread owner = Thread.currentThread();

  void x() {
    assert Thread.currentThread() == owner;
    /* Implement method. */
  }

}
即使断言被禁用,所有者引用仍然被填充,因此它不是完全“免费的”。我也不想用这个样板文件把我的很多课程弄得乱七八糟

该方法也可能对您有用。

具有许多有用的并发性。例如,当您从同步和非同步上下文访问同一对象时,当您在非最终对象上进行同步时,以及在其他情况下,它都会发出警告


同样,有许多类似的功能。

有用的并发检查。。。例如:)