【发布时间】:2009-10-14 09:31:52
【问题描述】:
如何确定需要同步的部分 Java 代码?有没有单元测试技术?
欢迎提供代码示例。
【问题讨论】:
标签: java concurrency synchronization
如何确定需要同步的部分 Java 代码?有没有单元测试技术?
欢迎提供代码示例。
【问题讨论】:
标签: java concurrency synchronization
当可能有多个线程同时处理相同的数据时,需要同步代码。
代码是否需要同步并不是你通过单元测试就能发现的。当您的程序是多线程时,您必须仔细考虑和设计您的程序以避免出现问题。
一本关于Java并发编程的好书是Java Concurrency in Practice。
【讨论】:
如果我正确理解你的问题,你想知道你必须同步什么。不幸的是,没有提供样板代码来向您展示要同步的内容 - 您应该查看可以由多个线程同时访问的方法和实例变量。如果没有,你通常不需要太担心同步。
【讨论】:
这是一些一般信息的好来源: http://weblogs.java.net/blog/caroljmcdonald/archive/2009/09/17/some-java-concurrency-tips
当您在 Java 中的多线程环境中并且想要并行执行许多操作时,我建议您使用一种使用并发队列(如 BlockingQueue 或 ConcurrentLinkedQueue)实现的方法和一个简单的 Runnable,它引用了队列并拉出队列的“消息”。使用 ExecutorService 来管理任务。一种(非常简化的)Actor 类型的模型。
所以尽量选择不共享状态,因为如果这样做了,就需要同步,或者使用像ConcurrentHashMap这样支持并发访问的数据结构。
【讨论】:
没有什么可以替代围绕您的代码考虑的问题(正如此处的其他答案所示)。不过,一旦你完成了这些,就值得在你的代码上运行FindBugs。它将识别您在哪里应用了同步不一致,并且对于跟踪其他难以发现的错误很有帮助。
【讨论】:
这里有很多不错的答案:
Java synchronization and performance in an aspect
您的问题的一个很好的分析可以在这里找到:
http://portal.acm.org/citation.cfm?id=1370093&dl=GUIDE&coll=GUIDE&CFID=57662261&CFTOKEN=95754288(需要访问 ACM 门户)
【讨论】:
是的,所有这些人都是对的——别无选择。但这是拇指规则.. 1.如果它是一个阅读 - 也许你不需要同步 2. 如果它是“写” - 你应该考虑它......
【讨论】: