单例模式设计
1、饿汉式
/**
* 饿汉式:直接创建对象,不管你是否需要,都会创建这个对象;
*
* 1、构造器私有化
* 2、自动创建,并且用静态保存
* 3、向外提供这个实例
* 4、强调这是一个单利模式,可以用最后的修饰
*/
公共类单线1 {
私有single on1(){ 0
}
公共静态最终single on1 INSTANCE=new single on1();
}
2、枚举
/**
* 枚举类型:表示该类型的对象是有限的几个,
* 我们定义成一个,就成了单利模式
*/
公共枚举单例2
情况
}
3、适用于初始化比较复杂的实例
/**
* 适用于初始化比较复杂的实例;
*/
公共类单线3 {
公共静态最终单线实例3
私有单例3(){ 0
}
静态{
//此处初始化其他数据;
INSTANCE=new Singlet 3();
}
}
4、懒汉式
/**
* 懒汉式:延迟创建这个实例对象;
*
* 1、构造器私有化
* 2、用一个静态变量保存这个唯一的实例;
* 3、提供一个静态方法,获取这个实例;
*/
公共类单线4 {
私有静态单身4实例;
私有single 4(){ 0
}
公共静态singleton 4 getInstance(){ 0
如果(实例==null){ 0
//线程。睡眠(100);此处睡眠,若两个线程同时进入,会创建两个对象
instance=new singleton 4();
}
返回实例;
}
}
/**
* 懒汉式:延迟创建这个实例对象;
*
* 1、构造器私有化
* 2、用一个静态变量保存这个唯一的实例;
* 3、提供一个静态方法,获取这个实例;
*/
公共类单线5 {
私有静态单线5实例;
私有singleton 5(){ 0
}
公共静态singleton 5 getInstance(){ 0
同步(单线5 .类){ 0
如果(实例==null){ 0
尝试{
//此处睡眠,若两个线程同时进入,会创建两个对象
线。睡眠(1000);
} catch(中断异常){ e
e。print stack trace();
}
instance=new singleton 5();
}
}
返回实例;
}
}
5、内部类的方式
//在内部类加载的时候才会创建对象情况
//静态内部类不会自动随着外部类的加载和初始化而初始化,他是单独去加载和初始化的;
公共类单线图6 {
私有singleton 6(){ 0
}
私有静态类内部{//内部类
私有静态最终singleton 6 INSTANCE=new singleton 6();
}
公共静态singleton 6 getInstance(){ 0
回归内心实例.
}
}
6、双端检索机制(DCL)
公共类单线图2 {
公共静态易失性单线态二氧化硅实例=null
私有singletondemo 2(){ 0
系统。出去。println(' single ondemo 2 ');
}
//DCL(双端检索机制)
公共静态SingletonDemo2 getInstance(){//由于指令重排机制,不一定100%线程安全
如果(实例==null){ 0
已同步(singletondemo 2。类){ 0
如果(实例==null){ 0
instance=new single ondemo 2();
}
}
}
返回实例;
}
公共静态void main(String[]参数){ 0
for(int I=0;i 1000I){ 0
新线程(()-{ 0
getInstance();
},String.valueOf(i)).start();
}
}
}
内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/154992.html