“`” 参考回答:

懒汉式单例模式:延迟实例化,但节省空间

<pre><code class=""language-java"" lang=""java"">package com.sxh.singleton;

public class SingleTon {

/*
* volatile关键字确保:当uniqueInstance变量被初始化为SingleTon实例时,多个线程能正确的处理uniqueInstance变量
* 分析:volatile修饰的成员变量,在每次被线程访问时,都强制性的从共享内存重读该成员的值;
* 当值发生变化是,强制线程将变化值写入共享内存,任何时候不同线程总是看到你某个成员变量的同一个值
* */
private volatile static SingleTon uniqueInstance;//利用一个静态变量来记录SingleTon类的唯一实例
//其他有用的单件类的数据
private SingleTon(){} //类外无法访问
public static SingleTon getInstance(){

/*
* 使用”双重检查加锁“,在getInstance中减少使用同步
* 首先检查是否实例已经创建了,如果尚未创建,才进行同步;只有第一次访问getInstance会同步
*/

if(uniqueInstance==null){ //确保只有一个实例
synchronized (SingleTon.class) { //多线程的情况不会出现问题,线程同步问题
if(uniqueInstance==null){
uniqueInstance=new SingleTon();//如果我们不需要这个实例,则永远不会产生
}
}
}
return uniqueInstance;
}
//其他有用的单件类的方法,单件类也可以是一般的类,具有一般的数据和方法
}
</code></pre>

饿汉式单例模式:急切的创建实例,而不用延迟实例化

<pre><code class=""language-java"" lang=""java"">package com.sxh.singleton;

public class SingleTon {

private volatile static SingleTon uniqueInstance=new SingleTon();
//其他有用的单件类的数据
private SingleTon(){} //类外无法访问
public static SingleTon getInstance(){
return uniqueInstance;
}

//其他有用的单件类的方法,单件类也可以是一般的类,具有一般的数据和方法
}
</code></pre>

IoDH实现单例模式

<pre><code class=""language-java"" lang=""java"">package com.sxh.singleton;

public class SingleTon {

private SingleTon(){} //类外无法访问
private static class HolderClass{ //静态内部类
private static final SingleTon uniqueinstance=new SingleTon();
}

public static SingleTon getInstance(){
return HolderClass.uniqueinstance;
}
//其他有用的单件类的方法,单件类也可以是一般的类,具有一般的数据和方法
}
</code></pre>

 

<pre><code> "“`

Was this helpful?

0 / 0

发表回复 0

Your email address will not be published.