成都哪家公司做网站比较好,锦州网站建设最低价,临沂森工木业有限公司,福州朝阳房产网站建设目录
什么是单例模式#xff1f;
定义
单例模式的主要特点 单例模式的几种设计模式
1.懒汉式#xff1a;线程不安全
2.懒汉式#xff1a;线程安全
3.饿汉式
4.双重校验锁
单例模式的优缺点
优点#xff1a;
缺点#xff1a;
适用场景#xff1a; 什么是单例模…目录
什么是单例模式
定义
单例模式的主要特点 单例模式的几种设计模式
1.懒汉式线程不安全
2.懒汉式线程安全
3.饿汉式
4.双重校验锁
单例模式的优缺点
优点
缺点
适用场景 什么是单例模式
定义
单例模式Singleton Pattern是一种创建型设计模式它保证一个类只有一个实例并提供一个全局访问点以供外部代码使用。 单例模式的主要特点
保证了类只有一个实例。由于只有一个实例存在因此可以避免多个实例之间的冲突。 提供了一个全局访问点。通过单例模式可以在任何需要时访问该类的唯一实例方便调用和使用。
能够解决频繁创建和销毁全局使用的类实例的问题。如果一个对象已经被创建了那么以后每次请求该对象时都会直接返回之前创建好的对象实例避免了重复创建和销毁对象的开销提高系统性能。 单例模式的几种设计模式
懒汉式在首次使用时创建实例。
饿汉式在类加载时就创建实例。
双重校验锁采用双锁机制安全且在多线程情况下能保持高性能。 1.懒汉式线程不安全
这种方式是最基本的实现方式这种实现最大的问题就是不支持多线程。因为没有加锁 synchronized所以严格意义上它并不算单例模式
public class LanHan {private LanHan(){}private static LanHan lanHan;public static LanHan getLanHan(){if(lanHannull){lanHan new LanHan();}return lanHan;}public void sayHello(){System.out.println(hello world);}
}
public class Test {public static void main(String[] args) {LanHan lanHan LanHan.getLanHan();lanHan.sayHello();}
} 2.懒汉式线程安全
这种方式具备很好的 lazy loading能够在多线程中很好的工作但是效率很低99% 情况下不需要同步。 优点第一次调用才初始化避免内存浪费。 缺点必须加锁 synchronized 才能保证单例但加锁会影响效率。
public class LanHan {private LanHan(){}private static LanHan lanHan;public static synchronized LanHan getLanHan(){if(lanHannull){lanHan new LanHan();}return lanHan;}public void sayHello(){System.out.println(hello world);}
}
public class Test {public static void main(String[] args) {LanHan lanHan LanHan.getLanHan();lanHan.sayHello();}
} 3.饿汉式
这种方式比较常用但容易产生垃圾对象。 优点没有加锁执行效率会提高。 缺点类加载时就初始化浪费内存。
public class EHan {private EHan(){}private static EHan eHan new EHan();public static EHan getEHan(){return eHan;}public void syHello(){System.out.println(hello world);}
}
public class Test {public static void main(String[] args) {LanHan lanHan LanHan.getLanHan();lanHan.sayHello();EHan eHan EHan.getEHan();eHan.syHello();}
} 4.双重校验锁
这种方式采用双锁机制安全且在多线程情况下能保持高性能。
public class DoubleLock {private static volatile DoubleLock doubleLock;private DoubleLock(){}public static DoubleLock getDoubleLock(){if(doubleLocknull){synchronized (DoubleLock.class){doubleLock new DoubleLock();}}return doubleLock;}public void sayHello(){System.out.println(hello world);}
}
public class Test {public static void main(String[] args) {LanHan lanHan LanHan.getLanHan();lanHan.sayHello();EHan eHan EHan.getEHan();eHan.syHello();DoubleLock.getDoubleLock().sayHello();}
} 单例模式的优缺点
优点
1、在内存里只有一个实例减少了内存的开销尤其是频繁的创建和销毁实例比如管理学院首页页面缓存。 2、避免对资源的多重占用比如写文件操作。
缺点
没有接口不能继承与单一职责原则冲突一个类应该只关心内部逻辑而不关心外面怎么样来实例化。
适用场景
需要全局访问和管理的资源可以确保资源的唯一性和一致性。
例如
1、要求生产唯一序列号。 2、WEB 中的计数器不用每次刷新都在数据库里加一次用单例先缓存起来。 3、创建的一个对象需要消耗的资源过多比如 I/O 与数据库的连接等。