1:设计模式(单例模式):
1
、单例类只能有一个实例。
2
、单例类必须自己创建自己的唯一实例。
3
、单例类必须给所有其他对象提供这一实例。
一、懒汉式单例
- //懒汉式单例类.在第一次调用的时候实例化自己
- public class Singleton {
- private Singleton() {}
- private static Singleton single=null;
- //静态工厂方法
- public static Singleton getInstance() {
- if (single == null) {
- single = new Singleton();
- }
- return single;
- }
- }
但是以上懒汉式单例的实现没有考虑线程安全问题,它是线程不安全的,并发环境下很可能出现多个Singleton实例,要实现线程安全,有以下三种方式,都是对getInstance这个方法改造,保证了懒汉式单例的线程安全,如果你第一次接触单例模式,对线程安全不是很了解,可以先跳过下面这三小条,去看饿汉式单例,等看完后面再回头考虑线程安全的问题:
1、在getInstance方法上加同步
- public static synchronized Singleton getInstance() {
- if (single == null) {
- single = new Singleton();
- }
- return single;
- }
二、饿汉式单例
- //饿汉式单例类.在类初始化时,已经自行实例化
- public class Singleton1 {
- private Singleton1() {}
- private static final Singleton1 single = new Singleton1();
- //静态工厂方法
- public static Singleton1 getInstance() {
- return single;
- }
- }
饿汉式在类创建的同时就已经创建好一个静态的对象供系统使用,以后不再改变,
所以天生是线程安全的。
1:当内部类访问外部类的时候,需要加
final.
单例步骤:(懒汉式)
1:声明一个类
2:构造函数私有化
3:声明一个静态对象(不适应呢final修饰)
4:封装一个静态方法(方法里面实例化对象)(但是线程不安全的)
三种方式保证线程安全(1,加同步锁,2:双锁机制3,静态内部类)
(1):
在getInstance方法上加同步
- public static synchronized Singleton getInstance() {
- if (single == null) {
- single = new Singleton();
- }
- return single;
- }
(2):
双重检查锁定
- public static Singleton getInstance() {
- if (singleton == null) {
- synchronized (Singleton.class) {
- if (singleton == null) {
- singleton = new Singleton();
- }
- }
- }
- return singleton;
- }
(3):
静态内部类
- public class Singleton {
- private static class LazyHolder {
- private static final Singleton INSTANCE = new Singleton();
- }
- private Singleton (){}
- public static final Singleton getInstance() {
- return LazyHolder.INSTANCE;
- }
- }
2:饿汉式
1:创建一个类
2:构造函数私有化
3:创建一个静态对象,并且实例化,并使用final修饰(使用final修饰的原因是保证对象不可改变)
4:创建一个静态方法返回该实例对象
静态代码块啥时候执行:(静态代码块优先于主函数执行)