繁体   English   中英

线程安全重构

[英]Thread-safety refactoring

我正在尝试使Java应用程序成为线程安全的。 不幸的是,它最初是为单用户模式设计的,所有键类都被实例化为单例。 更糟糕的是,有一堆接口充当常量容器和许多静态字段。
在这种情况下,什么被视为良好做法?

  • 只有一个入口点,所以我可以同步它并只使用缓冲池(某种),但是如果调用平均花费超过一分钟,则队列中的所有其他线程将不得不等待很长时间...
  • 由于测试代码的覆盖范围不是很理想,并且我不确定我是否忽略了某些内容,因此有关此区域中不良实现模式(类似于上述模式)的一些提示会很有用。
  • 我知道最好的办法是重写整个结构,但这不是一个选择。

听起来好像没有快速解决方案。 您可能应该首先重构现有代码以使用良好的设计模式,并着眼于将来对其进行多线程处理。 在清理完多线程之后,请稍后实施它。

正如乔纳森(Jonathan)所提到的那样,听起来好像并没有解决之道。

您可以考虑使用ThreadLocal以便提供专用的每个线程单例。 显然,这可能会或可能不会,这取决于单例内存在的状态,是否必须共享/维护等。

@coldphusion,您必须阅读/分析代码。 如果存在这样的工具,使用自动化工具就好比用脚砸自己。

另外,并非所有内容都必须是线程安全的。 如果一个对象永远不会从多个线程访问,则无需使其成为线程安全的。 如果对象是不可变的,那么它已经是线程安全的。

准备好告诉老板:“即使您知道,也不会花费数小时或一天的时间,所以请不要问。”

我建议阅读《 实践Java并发》

我会补充@nevermind的建议,因为他/她提出了一些非常实际的观点。

因为没有神奇的方法,所以对要完成任务需要更改的内容要切合实际。 您现有的代码(无论设计与否)可能仅需进行少量更改,具体取决于使用方式。 当然,这也意味着可能需要进行彻底的重新设计。

这里没有任何人知道(除非他们写了原始代码;-)

例如,如果您只需要访问单个对象(无论是单个对象还是非对象)都是线程安全的,则这很容易实现,可能不会对此类对象的调用者产生任何编码影响。

另一方面,如果您需要一次修改多个对象以保持数据/状态的完整性,那么您的工作将非常困难。

单例并不是一件坏事,只要它们不存储任何状态,就不会违反线程安全性。 只需查看任何J2EE应用即可; 很多单例,没有任何状态(仅引用其他无状态单例)。 所有状态都存储在会话中; 您可能会模仿,但是正如其他人所说,无法自动转换您的应用程序; 您将必须进行一些良好的分析,以确定如何重构它以将所有无状态bean与有状态bean分开,也许将状态封装在某些值对象中,等等。

如果有人也对该主题感兴趣-我找到了一个关于“做什么(不做)”的非常详细的教程 -具有常见的错误和最佳实践。
不幸的是,它仅在德语atm中可用:|

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM