Java 多线程安全 单例

来源:互联网 发布:梅西2016年个人数据 编辑:程序博客网 时间:2024/05/17 18:26

//非线程安全
这种处理方式在单线程的模式下可以很好的运行;但是在多线程模式下,可能产生问题。如果第一个线程发现成员变量为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;    }  }

原创粉丝点击