在单例模式中保持线程的引用是否安全?

6

让我给你举个例子。

假设我的第一个活动加载时也创建了一个线程,在后台无限运行。

现在,如果我转移到另一个活动,我认为最初在主要活动中创建的线程将继续运行。

那么,现在是我的主要问题 - 为了从其他活动管理此后台线程,在单例对象中存储对该线程的引用是否安全?


我在我的一个应用程序中做过类似的事情。没有遇到任何问题。 不过后来我转换为使用定时器任务(TimerTask)进行调度。看起来更安全和易于使用。 - Alex Orlov
2个回答

4
是和不是。从理论上讲,你不会有问题,但你必须不允许引用逃逸。
将引用保持在单例对象中可能会出现问题,它不能将引用传递给其他任何东西或允许其他任何东西访问它,否则它就会失去控制。
其次,由您的活动创建的线程不得访问其成员变量或允许对它们的引用逃逸。
关于这个领域的好书是Brian Goetz的"Java并发实践"。

+1 表示单例必须始终由控制器(而非原始活动)控制。 - Gary
很有道理 - 感谢您澄清。所讨论的线程将是自包含的,不会共享任何内容。 - xil3

2

需要注意的是,如果你有多个类加载器,就要小心了。只有使用相同的类加载器才能保证一个单例模式的实例。如果你的应用程序中有多个类加载器运行相同的类,则每个类加载器都会有另一个单例模式的实例。

大多数独立应用程序只使用一个类加载器,因此不会有任何问题。如果你只有一个类加载器,那么就没问题了。


+1 另一种可能的方式是将访问权限发布/共享。 - Jaydee

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接