幸运的是,FindBugs 拥有大量的检测器,它们可以帮助识别错误同步的类。 Inconsistent Synchronization 检测器很可能是 FindBugs 所使用的最复杂的检测器;它必须分析整个程序,而不仅仅是单个方法,使用数据流分析来确定什么时候加锁,并使用直观推断来推出一个类想要提供线程安全保证。基本上,对于每个域,它都会查看该域的访问模式,并且如果大多数访问都是同步实现的,那么没有同步的访问将被标记为可能的错误。类似地,如果一个属性的设置函数是同步的,而获取函数不是,那么 Inconsistent Synchronization 检测器将生成一条警告。
除了 inconsistent synchronization 之外,FindBugs 还包含其他很多用于检测常见线程错误的检测器,如在加锁两次的情况下等待监视器(这虽然不一定是 bug,但是可能导致死锁),使用双检测加锁模式,不正确地初始化非易失性的域,对线程调用 run() 而不是启动线程,从构造函数中调用 Thread.start() ,或者没有将 wait() 包装到循环中就调用它。