【问题标题】:How do I analyze Java source code and ensure it is Thread safe如何分析 Java 源代码并确保它是线程安全的
【发布时间】:2013-03-31 15:34:15
【问题描述】:

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

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

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

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

【问题讨论】:

  • 是的。 FindBugs 可以执行这样的分析。见:stackoverflow.com/questions/2423266/thread-safety-framework
  • 嗯,由线程创建并仅由该线程引用的对象实例(例如,它的引用是本地变量)本质上不与任何其他线程共享。
  • 我应该注意的其他一般“规则/要点”是什么?

标签: java multithreading thread-safety


【解决方案1】:

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

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

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

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

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

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

      【解决方案3】:

      我不认为 eclipse 会提供任何这样的插件。除了局部变量,尝试使用不可变对象、ThreadLocals 和大多数 od 多线程问题都会得到解决。

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          【解决方案5】:

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

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

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

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

          【讨论】:

            【解决方案6】:

            ThreadSafe(http://www.contemplateltd.com/threadsafe,提供免费试用)完全符合问题的要求。有关它在包括 Apache JMeter 和 K9Mail 在内的开源应用程序中发现的并发错误示例,请参阅此 InfoQ article。请参阅Ivan Senic's blog 了解用户意见。 ThreadSafe's Wikipedia entry 给出了一个简短的总结。

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2011-05-25
              • 1970-01-01
              • 2013-03-31
              • 1970-01-01
              • 2011-01-15
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多