单例模式

公司主营业务:成都网站设计、网站制作、外贸营销网站建设、移动网站开发等业务。帮助企业客户真正实现互联网宣传,提高企业的竞争能力。创新互联是一支青春激扬、勤奋敬业、活力青春激扬、勤奋敬业、活力澎湃、和谐高效的团队。公司秉承以“开放、自由、严谨、自律”为核心的企业文化,感谢他们对我们的高要求,感谢他们从不同领域给我们带来的挑战,让我们激情的团队有机会用头脑与智慧不断的给客户带来惊喜。创新互联推出靖西免费做网站回馈大家。
一个类只有一个实例,并且可以全局访问使用
应用场景
如账户管理类,数据库操作类等(某个对象频繁被访问使用)
常用方式
饿汉式
懒汉式
同步加锁
DCL双重加锁验证
静态内部类
枚举单例
饿汉式
加载类的同时立即进行初始化操作,对资源消耗很大
public class SingleTest {
public static final SingleTest singleTest1=new SingleTest();
public SingleTest() {
}
public static SingleTest getSingleTest1(){
return singleTest1;
}
}
懒汉式
优点:需要使用时候才进行初始化加载
缺点:线程不安全,在多线程中很容易出现不同步的情况
public class SingleTest1 {
private static SingleTest1 instance=null;
public SingleTest1() {
}
public static SingleTest1 getInstance(){
if(instance==null){
instance=new SingleTest1();
}
return instance;
}
}
同步加锁
优点:解决线程安全问题
缺点:每次实例需要判断加锁状态,效率低下
public class SingleTest2 {
private static SingleTest2 instance=null;
public SingleTest2() {
}
public static synchronized SingleTest2 getInstance(){
if(instance==null){
instance=new SingleTest2();
}
return instance;
}
}
DCL双重校验
优点:并发不高的情况下可以完美运行(推荐使用,客户端几乎不存在高并发情况)
缺点:JDK1.5以前可能会出现instance为初始化的问题(现在的Android几乎都是1.7 1.8了几乎可以略率此问题)
public class SingleTest4 {
private static SingleTest4 instance=null;//静态变量
public SingleTest4() {
}
public static SingleTest4 getInstance(){
if (instance == null) {//第一层校验
synchronized (SingleTest4.class) {
if (instance == null) {//第二层校验
instance = new SingleTest4();
}
}
}
return instance;
}
}
静态内部类
优点:延迟加载,线程安全,内存消耗少(推荐使用)
public class SingleTest5 {
private SingleTest5() {
}
public static final SingleTest5 getInstance() {
return SingletonHolder.INSTANCE;
}
//定义的静态内部类
private static class SingletonHolder {
private static final SingleTest5 INSTANCE = new SingleTest5(); //创建实例的地方
}
}
枚举单例
优点:线程安全,防反序列化,防反射,写法简单
public enum SingleTest6 {
//第一种方式
// INSTANCE;
// private CaiPiao instance;
//
// SingleTest6() {
// instance = new CaiPiao();
// }
//
// public CaiPiao getInstance() {
// return instance;
// }
//
// class CaiPiao {
//
// }
//第二种方式
INSTANCE2{
@Override
protected void CaiPiao() {
System.out.println("彩票");
}
};
protected abstract void CaiPiao();
}
github代码地址
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持创新互联。