//大家都知道的单例
public class OneThreaDSingle {
public OneThreaDSingle newSingle = null;
private OneThreaDSingle(){
}
public OneThreaDSingle getIntence(){
if(newSingle == null){
newSingle = new OneThreaDSingle();
}
return newSingle;
}
}
//多线程下的单例:
public class MultithreadingSingle {
public MultithreadingSingle multitSingle = null;
private MultithreadingSingle(){
}
public MultithreadingSingle getInstance(){
//在使用锁之前进行判断,可以减少锁的造成的效率不高问题
if(multitSingle == null) {
synchronized (MultithreadingSingle.class) {
if (multitSingle == null) {//此不可少
multitSingle = new MultithreadingSingle();
}
}
}
return multitSingle;
}
}
使用volatile关键字,在上一个方法中更上一层楼
public class VolatilemMultitSingle {
public volatile VolatilemMultitSingle volatilSingle = null;
private VolatilemMultitSingle(){
}
public VolatilemMultitSingle getInstance(){
if(volatilSingle == null){
synchronized (VolatilemMultitSingle.class){
if(volatilSingle == null){
/**
* 该操作可底层分解为三个步骤
* 1、创建控件
* 2、初始化
* 3、对象引用指向变量
* 这三个步骤处理器出于优化的目的可能会重排序,
* 可能将2和三对调,造成获得的对象不是想要的对象
* 而volatile的作用就是限制重排序
*/
volatilSingle = new VolatilemMultitSingle();
}
}
}
return volatilSingle;
}
}
//最简单的单例
public class StaticInnerClassSingle {
private StaticInnerClassSingle()
}
private static class InitializeSingle{
final static StaticInnerClassSingle staticSingle = new StaticInnerClassSingle();
}
/**
* 调用该方法时,内部类InitializeSingle初始化,
* StaticInnerClassSingle对象是静态变量,只会初始化一次
*/
public StaticInnerClassSingle getInstance(){
return InitializeSingle.staticSingle;
}
}
还有一种方法是用枚举创建单例,这个楼主不是很理解,先不写。
参考:《java多线程编程实战指南》