5

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

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

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

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

4

6 回答 6

5

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

事实上,它synchronized代表了所有可能解决方案的 5%。例如,考虑并发集合,ConcurrentHashMap这是经过深思熟虑的,并且没有使用基本的大锁定=>比这更复杂。

想一想volatile,通过任何锁来执行确保屏障内存的同时避免任何类型的原子性;原子性不是它的作用,但在某些情况下,避免它以提高性能会很好。

因此,为了线程安全,忘记任何插件(即使可能存在一些插件),但相信你的大脑;)

注意:将synchronized关键字放在每个写作课上,会............丑陋而不谈论糟糕的表现......

于 2013-03-31T15:54:09.847 回答
2

我认为没有任何东西可以明确地检查线程安全性,已经提到了一些工具,比如findbugs可以合理地找到明显的错误。

程序员非常有责任确保他们的程序不会将变量或引用泄漏到不同的线程中,并且在多个线程中使用事物以确保每个线程都看到“正确”的值。

在性能之前进行安全设计,您可能会发现它可以很好地满足您的需求,但如果您进行优化会增加复杂性和潜在的故障,它可能最终不会成为瓶颈。

我建议阅读专门阅读Java Concurrency In Practice,您也可能会发现Effective Java也很有帮助。

于 2013-03-31T16:13:00.563 回答
0

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

于 2013-03-31T15:47:05.960 回答
0

我还没有看到可以检测死锁的编译时工具。那将很难建模。我只知道有些人已经尝试过了

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

于 2013-03-31T15:53:07.563 回答
0

更多的评论,但有点太长了。

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

并非如此 - 以 Vector 类为例:它是同步的,但迭代需要外部锁定。例如,并发替代方案是 CopyOnWriteArrayList,它允许迭代而无需锁定整个集合。

其他人已经回答的底线:它不像synchronized到处添加那么简单。您需要精确分析类的契约,并确保契约在多线程情况下仍然履行。

于 2013-03-31T17:58:15.700 回答
0

ThreadSafe(http://www.contemplateltd.com/threadsafe,提供免费试用版)正是问题所要求的。请参阅这篇InfoQ 文章,了解它在包括 Apache JMeter 和 K9Mail 在内的开源应用程序中发现的并发错误示例。有关用户的意见,请参阅Ivan Senic 的博客ThreadSafe 的 Wikipedia 条目给出了一个简短的总结。

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

于 2014-06-21T06:26:05.060 回答