首页 > 试题广场 >

实现一个适用于多线程的单列模式的类。

[问答题]

实现一个适用于多线程的单列模式的类。

class  Single
{
	private Single(){}
	private static Single s = null;
	public static Single getInstance(){
		if(s == null){
			synchronized(Single.class){
				if(s == null){
					s = new Single();
				}
			}
		}
		return s;
	}
}


编辑于 2017-01-16 15:06:22 回复(1)
构造函数私有,不是不可以new创建对象么,那么为什么这儿可以?有没有人可以帮我解答一下困惑。
发表于 2017-05-28 08:25:31 回复(0)
public class Single{
    //私有化构造器
    private Sigle(){
    }
    //用一个静态内部类holder一个静态成员。
    private static class SingleHolder{
         private static Single instance = 
                new Single();
    }
    
    public Single getInstance(){
        return SingleHolder.instance;
    }
}
解释为什么线程安全: getInstance()中的 SingleHolder第一次调用时,会触发SingleHolder的初始化动作。初始化是执行类构造器 <clinit>()方法的过程。<clinit>()是由编译器自动收集类中所有的类变量的赋值动作和静态代码块语句生成的,并且是按照源程序声明的顺序。虚拟机会保证 一个类的<clinit>方法在多线程的情况下被正确的同步。
编辑于 2017-01-25 13:09:09 回复(0)