单例模式的同步

博客介绍了使用两个锁来解决单例模式的同步问题,聚焦于信息技术领域中设计模式与并发控制的结合,为单例模式的同步提供了一种解决方案。

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

用两个锁解决单例模式的同步

public class Singleton {

private static Singleton instance = null;

static int i = 0;
//建实例锁 锁命令: i++ ,所有线程都可以开锁就是: i-- 命令,
//开锁的可能需要重新锁上。只有有资格建立实例的不用重新锁,有资格建立实例的条件时第一个开锁

static int j = 0;
//监视器 当多个实例开锁时监视是否有最先开锁的

public static Singleton getInstance() {

if (instance == null && i == 0) {
//如果没有实例,并且线程被锁(就是没线程可以最先开锁)

i++;
//进门就关门
j++;
//开始监视


//“开锁-重锁” 循环过程。 最先开锁的线程可以不重锁以建实例
while (i == j) {
//循环 如果没有一个线程能最先开锁
//则此次过程失败,循环下去.

i--; //开锁

if (j == i + 1) {
//本线程最先开锁,可以不重锁
instance = new Singleton();
//建实例,不重锁
}
else {
//不是第一个开锁的,可能和其线程一起开锁,也可能落后其他线程

i++;
//重锁

}
}
}

while (instance == null) {
//已经有线程最先开锁 只是没建完实例。等待
try {
Thread.sleep(1);
}
catch (InterruptedException ex) {

}
}

return instance;

}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值