# 单例模式
#单例模式-->从始至终 只产生一个示例
#代码
public class Single {private static Single instance;
private Single(){
}
public Single getInstance(){
if(instance!=null){
instance = new Single();
}
return instance;
}
}
# Static 修饰变量表示是静态变量
被 static修饰 表示是静态变量 没有表示是实例变量 二者的区别 在于 静态变量 在 加载类的时候就会分配内存 可以用类名直接访问 实例变量 会在类实例化的时候 进行内存分配 会在内存中有多个备份 互不影响 静态变量 只会在内存中有一个
实例变量 只有在用的时候 才会实例化 但是静态变量 只要加载类 就会实例化 但是只会有一个
要点 1 。 静态全局变量 instance
2. 构造方法 私有化 private 这样 非子类都不能访问
3. public 的getInstance方法 来实例化对象
# 如果多个线程 同时访问 有可能实例化多个对象出来
比如 线程一 运行到 if判断的时候 sleep一秒钟 线程二 运行过来if 这是 实例已经被创建了 但是 线程一 仍然 任务 instance 是null 于是又创建了新 的一个
#解决办法 使用 synchronize 同步代码块 当 线程一 运行该部分代码时 线程二 会等待他 运行结束 在运行 该部分代码
**************************完美解决方式*********************************
*/
/**
* 使用静态内部类来实现 静态内部类只能访问外部类的静态成员 静态内部类不能new
* @author arthas
*
*/
public class Single {
//1 一个私有的构造方法 保证 获取该实例的时候 不会通过此方法
private Single() {
}
// 2 一个公共的静态内部类 里面只有一个静态的最终类 实例对象 instance
public static class Singleton1{
private static final Single instance = new Single();
}
//一个公共的构造方法 得到instance实例 静态变量可以通过 类名点点的方式直接获取
public static Single getInstance(){
return Singleton1.instance;
}
}