/*
* 单例设计模式:
* 避免其它程序过多建立该类对象,
* 先禁止其他程序建立该类对象。
* 还要让其他程序访问到该类对象,
* 在本类中自己定义一个对象。
* 方便其他程序可以访问,
* 对外提供访问方式
*
* 体现:
* 构造函数私有化
* 在类中创建一个本类对象
* 提供获取该类对象方法
*/
/*
* 这种方式叫做饿汉式
* Singleton类一进内存,就已经创建好了对象
*/
public class Singleton {
private Singleton() {
}
// 这里必须是私有的,要不然外面的程序可以直接访问这个属性了
private static Singleton s = new Singleton();
public Singleton getInstance() {
return s;
}
}
/*
* 这种方式叫懒汉式
* Singleton一进内存,对象还没存在
* 只有调用了getInstance方法才建立对象
* 延迟加载
*/
public class Singleton {
private Singleton() {
}
// 这里必须是私有的,要不然外面的程序可以直接访问这个属性了
private static Singleton s = null;
public Singleton getInstance() {
if (s == null) {
s = new Singleton();
}
return s;
}
}
/*
* 饿汉式,简单,安全,懒汉式存在缺陷, 因为如果A、B同时调用懒汉式的getInstance方法, A调用时,执行到s==null不执行了,
* cpu去执行B的getInstance方法去了, 执行到s==null的时候也不执行了,cpu又去执行A了,
* 然后Anew了个对象赋值给了s,返回了。然后cpu又去执行B, B也new了个对象赋值给s,把A里的s覆盖掉了!,也返回了,
* 这时候就不是同一对象了(典型的线程同步问题, 解决方案是在getInstance方法上加上synchronized,
* 把s对象锁起来就好了)加上锁程序效率就低了 最终解决方案:双重判断、减少读锁次数
*/
/*
* public Singleton getInstance() { if(s == null) { synchronized
* (Singleton.class) { if(s == null) { s = new Singleton(); } } } return s; }
*/
java单例设计模式详解
最新推荐文章于 2024-01-04 18:31:21 发布