据我所知,singleton Object不是线程安全的,而session Factory singleton对象是线程安全的。 怎么可能,请解释一下。
答案 0 :(得分:2)
单例模式本身既不是线程安全的,也不是线程安全的。您必须查看您的具体实施。主要问题是,管理状态吗?
如果是这样,那么您将确保允许不超过一个线程同时更改状态。这是全局变量在线程安全方面遇到的同样问题。但是有一些机制可以确保这种安全,一种叫做互斥。同时修改同一个变量的两个线程的事件是一个有问题的事件,还有更多需要注意的事件。就像两个线程顺序修改一个变量一样,问题就是答案的重要性。
一般来说,互斥事件和java上下文中的具体解释分别可以找到here (Mutually exclusive events)和here (Oracle concurrency guide)。解释全局变量here。关于concurrency, parallelism and thread-safety,无状态和有状态也是很好的术语。
回到你的问题:工厂通常不会引入任何状态,但可以在多个线程之间自由共享。工厂生成的实例很可能是有状态的,只有在线程安全后才能在线程之间共享。
重要提示: 但是不要误解我的意思。不要忘记总是检查你的单身人士的实施!在java中,您可以引入注释来记录您的调查,并将特定代码元素标记为线程安全的。存在已经定义了通常可用的注释来记录这种行为的包,看看apache org.apache.http.annotation。当您使用API时,最好检查文档以获取此类提示。
答案 1 :(得分:0)
会话工厂对象也使用singleton
设计模式实现。
单身设计模式可以设为thread safe
。
他们已经为会话工厂实现了具有线程安全性的单例。
当我们实施singleton
时,我们应该确定我们是否需要线程安全,我们应该相应地实施。
在设计模式下的博客中查看单例的各种实现