[英]Thread-safety refactoring
我正在尝试使Java应用程序成为线程安全的。 不幸的是,它最初是为单用户模式设计的,所有键类都被实例化为单例。 更糟糕的是,有一堆接口充当常量容器和许多静态字段。
在这种情况下,什么被视为良好做法?
听起来好像没有快速解决方案。 您可能应该首先重构现有代码以使用良好的设计模式,并着眼于将来对其进行多线程处理。 在清理完多线程之后,请稍后实施它。
正如乔纳森(Jonathan)所提到的那样,听起来好像并没有解决之道。
您可以考虑使用ThreadLocal
以便提供专用的每个线程单例。 显然,这可能会或可能不会,这取决于单例内存在的状态,是否必须共享/维护等。
@coldphusion,您必须阅读/分析代码。 如果存在这样的工具,使用自动化工具就好比用脚砸自己。
另外,并非所有内容都必须是线程安全的。 如果一个对象永远不会从多个线程访问,则无需使其成为线程安全的。 如果对象是不可变的,那么它已经是线程安全的。
准备好告诉老板:“即使您知道,也不会花费数小时或一天的时间,所以请不要问。”
我建议阅读《 实践Java并发》 。
我会补充@nevermind的建议,因为他/她提出了一些非常实际的观点。
因为没有神奇的方法,所以对要完成任务需要更改的内容要切合实际。 您现有的代码(无论设计与否)可能仅需进行少量更改,具体取决于使用方式。 当然,这也意味着可能需要进行彻底的重新设计。
这里没有任何人知道(除非他们写了原始代码;-)
例如,如果您只需要访问单个对象(无论是单个对象还是非对象)都是线程安全的,则这很容易实现,可能不会对此类对象的调用者产生任何编码影响。
另一方面,如果您需要一次修改多个对象以保持数据/状态的完整性,那么您的工作将非常困难。
单例并不是一件坏事,只要它们不存储任何状态,就不会违反线程安全性。 只需查看任何J2EE应用即可; 很多单例,没有任何状态(仅引用其他无状态单例)。 所有状态都存储在会话中; 您可能会模仿,但是正如其他人所说,无法自动转换您的应用程序; 您将必须进行一些良好的分析,以确定如何重构它以将所有无状态bean与有状态bean分开,也许将状态封装在某些值对象中,等等。
如果有人也对该主题感兴趣-我找到了一个关于“做什么(不做)”的非常详细的教程 -具有常见的错误和最佳实践。
不幸的是,它仅在德语atm中可用:|
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.