如何分析Java源代码并确保它是线程安全的

时间:2013-03-31 15:34:15

标签: java multithreading thread-safety

我正在阅读java代码以确保它是线程安全的。

据我所知,该方法中的任何局部变量都是线程安全的,因为它属于堆栈内存地址。任何类/实例变量都不是线程安全的,因为它属于堆内存,由其他线程共享。

根据经验,我可以在触及类变量的每个方法上放置一个synchronized关键字。

是否有任何eclipse插件,或者我可以分析/防止多线程问题的规则?

6 个答案:

答案 0 :(得分:5)

线程世界是一个优秀程序员最敏感的事情之一。 线程问题的每个解决方案都需要对上下文有很好的了解。 每次选择最相关的解决方案时,任何插件都不够“智能”。

实际上,synchronized代表了每种可能解决方案的约5%。 考虑并发集合,ConcurrentHashMap例如,这是非常好的想法,并且不使用基本的大锁定=>更多的研究比这更复杂。

想到volatile,执行确保障碍记忆,同时通过任何锁避免任何种类的原子力; 原子性不是它的作用,但在某些情况下,这样可以避免它提高性能。

因此,忘记任何插件(即使有些插件可能存在)以保证线程安全,但要相信你的大脑;)

注意:在每个写作课上加上synchronized关键字,如果没有谈论糟糕的表现,那就太丑了......

答案 1 :(得分:1)

我认为没有什么可以明确检查线程安全性,有一些工具已经提到过,比如findbugs会找到明显错误的合理工作。

程序员可以确保他们的程序不会将变量或引用泄漏到不同的线程中,并且在多个线程中使用的东西确保每个线程都能看到“正确”的值。

在性能之前设计安全性,您可能会发现它可以满足您的需求,但如果您在优化中增加了复杂性并可能导致失败,那么它可能不会成为瓶颈。

我建议您专门阅读阅读Java Concurrency In Practice,您也可以找到Effective Java

答案 2 :(得分:0)

我不认为eclipse会提供任何这样的插件。与局部变量一起尝试使用Immutable对象,ThreadLocals和大多数od多线程问题都将被处理。

答案 3 :(得分:0)

我没有看到可以检测死锁的编译时工具。这很难建模。我所知道的只是some people have tried

您始终可以在运行时检测它们。可以查询JMX Beans以显示死锁线程,如本答案中所述 - Deadlock detection in Java

答案 4 :(得分:0)

更多评论但有点太长了。

  

根据经验,我可以在触及类变量的每个方法上放置一个synchronized关键字。

不是真的 - 想想Vector类的例子:它是同步的,但是迭代需要外部锁定。例如,并发alernative是CopyOnWriteArrayList,它允许迭代而无需锁定整个集合。

其他人已经回答过底线:它并不像在任何地方添加synchronized那么简单。您需要精确分析类的合同,并确保在多线程情况下仍然满足合同。

答案 5 :(得分:0)

ThreadSafe(http://www.contemplateltd.com/threadsafe,免费试用版)正是问题所要求的。有关在开源应用程序(包括Apache JMeter和K9Mail)中找到的并发错误的示例,请参阅此InfoQ article。有关用户的意见,请参阅Ivan Senic's blogThreadSafe's Wikipedia entry给出了简短的总结。

(披露:ThreadSafe是一种商业工具,我是Contemplate的联合创始人,Contemplate是生产它的公司。)