ooad单例模式-Singleton
//饿汉式一(预加载) 不能用于多线程
/*public class Car {
private static Car c = new Car();
private Car(){}
public static Car getInstanse(){
return c;
}
}*/
/*
/**
* 静态初始化器,由JVM来保证线程安全
*/
private static Singleton instance = new Singleton();
}
/**
* 私有化构造方法
*/
private Singleton(){
}
public static Singleton getInstance(){
return SingletonHolder.instance;
}
}*/
/*
public class Car{
private static Car c = null;
private Car(){};
public synchronized static Car getInstanse(){
if(c==null){
c = new Car();
}
return c;
}
}*/
private static class SingletonHolder {
private static final Singleton INSTANCE = new Singleton();
}
private Singleton (){}
public static final Singleton getInstance() {
return SingletonHolder.INSTANCE;
}
}
//枚举
public class Car{
private static Car c = null;
private Car(){};
public static Car getInstanse(){
if(c==null){
synchronized (Car.class) {
if(c==null){
c = new Car();
}
}
}
return c;
}
}
1.如果单例由不同的类装载器装入,那便有可能存在多个单例类的实例。假定不是远端存取,
例如一些servlet容器对每个servlet使用完全不同的类装载器,这样的话如果有两个servlet访问一个单例类,它们就都会有各自的实例。
2.如果Singleton实现了java.io.Serializable接口,那么这个类的实例就可能被序列化和复原。
不管怎样,如果你序列化一个单例类的对象,接下来复原多个那个对象,那你就会有多个单例类的实例。
//第一种的修复方式:
private static Class getClass(String classname)
throws ClassNotFoundException {
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
if(classLoader == null)
classLoader = Singleton.class.getClassLoader();
return (classLoader.loadClass(classname));
}
}
//第二种的修复方式:
public static Singleton INSTANCE = new Singleton();
protected Singleton() {
}
private Object readResolve() {
return INSTANCE;
}
}
最新文章
- HTML5 canvas画布写炫彩动态的倒计时效果
- Solr入门之(3)常用概念说明(持续补充):
- 马哥教育视频笔记:01(Linux常用命令)
- CodeForces 656B
- git bash中带空格的文件夹以及文件的处理
- [hadoop源代码解读] 【SequenceFile】
- java邮件小实例
- hdu4956 Poor Hanamichi
- 关于ng路由的传参问题(传递一个,多个参数)
- JS中创建自定义对象的方法
- easyui点击搜索的时候获取不要文本框里面的值的问题
- POJ - 1984 Navigation Nightmare 种类并查集
- css变化代码
- DFA确定有限状态自动机
- JavaScript之DOM对象的获取
- iOS项目之交换方法(runtime)
- javaScript 中的私有,共有,特权属性和方法
- 1.开始学习ASP.NET MVC
- C# 哈希表&;列队&;栈
- charAt和String的用法