//非线程安全
这种处理方式在单线程的模式下可以很好的运行;但是在多线程模式下,可能产生问题。如果第一个线程发现成员变量为null,准备创建对象;这是第二个线程同时也发现成员变量为null,也会创建新对象。这就会造成在一个JVM中有多个单例类型的实例。如果这个单例类型的成员变量在运行过程中变化,会造成多个单例类型实例的不一致,产生一些很奇怪的现象。例如,某服务进程通过检查单例对象的某个属性来停止多个线程服务,如果存在多个单例对象的实例,就会造成部分线程服务停止,部分线程服务不能停止的情况
public class TestService{
private static TestService instance = null;
private TestService() {
} public static TestService getInstance() { if (instance == null) { instance=new TestService(); } return instance; } } |
//线程安全
这种处理方式虽然引入了同步代码,但是因为这段同步代码只会在最开始的时候执行一次或多次,所以对整个系统的性能不会有影响。
public class TestService{
private static TestService instance = null;
private TestService() {
} private static synchronized void syncInit() { if (instance == null) { instance = new TestService(); } } public static TestService getInstance() { if (instance == null) { syncInit(); } return instance; } } |
本文探讨了单例模式在多线程环境下可能出现的问题,特别是当多个线程同时尝试创建单例对象时可能导致的实例不一致现象。并提供了一种解决方案——通过引入同步代码确保单例对象的唯一性。
1632

被折叠的 条评论
为什么被折叠?



