Java 多线程安全 单例

本文探讨了单例模式在多线程环境下可能出现的问题,特别是当多个线程同时尝试创建单例对象时可能导致的实例不一致现象。并提供了一种解决方案——通过引入同步代码确保单例对象的唯一性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

  }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值