假设在java中我们有一些对象/组(服务对象,控制器等),我们在单线程应用程序中使用它们。我们用“A”来称呼这个对象。
经过一段时间后,我们正在扩展我们的线程模型,并希望在其他线程中也使用这些对象(例如侦听器线程等)。
当然,在这种情况下,我们必须了解同步问题等。但是到目前为止使用对象“A”的开发人员无法意识到我们的架构发生了变化,如果他将某些内容添加到类/(对象)“A”,他可能无法正确处理同步。 当然,这个开发人员应该检查代码中所有出现的类“A”,但如果他不习惯在多线程环境中使用这个类,他可能不会这样做。
我的问题是......对于那种情况是否有任何好的模式,它将类/(对象)“A”标记为“多线程可用”。例如,某些接口的实现仅用于“信息”目的等。
答案 0 :(得分:2)
我通常在代码顶部的JavaDoc中添加注释,表明某些东西是用于多线程的。
我经常添加单元测试,以便明确使用。
然后由其他开发人员来阅读文档和单元测试,以便他们了解预期的用途。
答案 1 :(得分:1)
如果此对象是loosely coupled及其所有客户端,则应该可以创建“A”的线程安全版本。
直接来自JDK的一个例子:
java.lang.Appendable - the interface
java.lang.StringBuilder - regular implementation
java.lang.StringBuffer - thread-safe implementation
客户端不必知道,如果它是一个线程安全的版本,因为它通过接口间接使用该对象:
void doSomething(Appendable a) {
a.append(...);
}
从实际角度来看,使用inversion of control可以提供很大帮助。使用接口进行业务合同声明和Spring(或任何其他依赖注入框架)进行组件注入(无论是否是线程安全的,仅取决于配置)。
底线:您可以通过松散耦合和智能架构设计(关注点分离等)来防止此类问题。