【问题标题】:How to determine what part of Java code needs to be synchronized?如何确定Java代码的哪一部分需要同步?
【发布时间】:2009-10-14 09:31:52
【问题描述】:

如何确定需要同步的部分 Java 代码?有没有单元测试技术?

欢迎提供代码示例。

【问题讨论】:

    标签: java concurrency synchronization


    【解决方案1】:

    当可能有多个线程同时处理相同的数据时,需要同步代码。

    代码是否需要同步并不是你通过单元测试就能发现的。当您的程序是多线程时,您必须仔细考虑和设计您的程序以避免出现问题。

    一本关于Java并发编程的好书是Java Concurrency in Practice

    【讨论】:

    • +1:设计应该考虑并发性。您可能不会发现所有需要与测试同步的地方。相反,您将实现一个在重负载下容易崩溃的系统。
    • +1 表示“不是您可以通过单元测试发现的东西”,尽管您可能能够通过处理器密集型测试找到一小部分缺陷。
    【解决方案2】:

    如果我正确理解你的问题,你想知道你必须同步什么。不幸的是,没有提供样板代码来向您展示要同步的内容 - 您应该查看可以由多个线程同时访问的方法和实例变量。如果没有,你通常不需要太担心同步。

    【讨论】:

      【解决方案3】:

      这是一些一般信息的好来源: http://weblogs.java.net/blog/caroljmcdonald/archive/2009/09/17/some-java-concurrency-tips

      当您在 Java 中的多线程环境中并且想要并行执行许多操作时,我建议您使用一种使用并发队列(如 BlockingQueue 或 ConcurrentLinkedQueue)实现的方法和一个简单的 Runnable,它引用了队列并拉出队列的“消息”。使用 ExecutorService 来管理任务。一种(非常简化的)Actor 类型的模型。

      所以尽量选择不共享状态,因为如果这样做了,就需要同步,或者使用像ConcurrentHashMap这样支持并发访问的数据结构。

      【讨论】:

        【解决方案4】:

        没有什么可以替代围绕您的代码考虑的问题(正如此处的其他答案所示)。不过,一旦你完成了这些,就值得在你的代码上运行FindBugs。它将识别您在哪里应用了同步不一致,并且对于跟踪其他难以发现的错误很有帮助。

        【讨论】:

          【解决方案5】:

          这里有很多不错的答案:

          Java synchronization and performance in an aspect

          您的问题的一个很好的分析可以在这里找到:

          http://portal.acm.org/citation.cfm?id=1370093&dl=GUIDE&coll=GUIDE&CFID=57662261&CFTOKEN=95754288(需要访问 ACM 门户)

          【讨论】:

            【解决方案6】:

            是的,所有这些人都是对的——别无选择。但这是拇指规则.. 1.如果它是一个阅读 - 也许你不需要同步 2. 如果它是“写” - 你应该考虑它......

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2023-03-20
              • 2011-02-03
              • 1970-01-01
              • 2010-10-03
              • 2017-03-27
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多