package day06;
//对于单例模式的几种实现方式,知道饿汉式和懒汉式的区别,线程安全,资源加载的时机,还有懒汉式为了实现线程安全的3种方式的细微差别。
public class SingleDemo {
public static void main(String[] args) {
Single s1 = Single.getSingle();
Single s2 = Single.getSingle();
s1.setName("zhangsan");
//s2.setName("lisi");
System.out.println(s2.name);
System.out.println(s1 == s2);//只创建了一个实例
// Single s3 = new Single(); 单例模式不允许创建对象
Single1 ss1 = Single1.getInstance();
Single1 ss2 = Single1.getInstance();
System.out.println(ss1 == ss2);
}
}
//饿汉式和懒汉式区别
//饿汉就是类一旦加载,就把单例初始化完成,保证getInstance的时候,单例是已经存在的了,
//而懒汉比较懒,只有当调用getInstance的时候,才回去初始化这个单例。
/*1、线程安全:
饿汉式天生就是线程安全的,可以直接用于多线程而不会出现问题,
懒汉式本身是非线程安全的,为了实现线程安全有几种写法,分别是上面的1、2、3,这三种实现在资源加载和性能方面有些区别。*/
class Single {// 单例模式演示 ----饿汉式---安全
private static Single s = new Single();
public static Single getSingle() {
return s;
}
private Single() {
}
String name;
public void setName(String name) {
this.name = name;
}
public String getName() {
return this.name;
}
}
class Single1 {// 单例模式演示 ----懒汉式---线程不安全,必须加同步
private static Single1 ss = null;//在getInstance方法上加同步(这种方法 该例子没用,这种方法会降低性能的)
public static Single1 getInstance() {
if (ss == null) {
synchronized (Single.class) {//双重检查锁定,避免了 每次同步的性能损失
if (ss == null)
ss = new Single1();
}
}
return ss;
}
private Single1() {
}
String name;
public void setName(String name) {
this.name = name;
}
}
java 设计模式---单例模式
最新推荐文章于 2024-01-23 10:00:27 发布