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;
} }

|