[Java设计模式]单例模式笔记

这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。

注意:

1、单例类只能有一个实例。

2、单例类必须自己创建自己的唯一实例。

3、单例类必须给所有其他对象提供这一实例。

(以上摘自菜鸟教程)

比如说我需要使用数据库,但是我不希望每一次修改数据时都建立新的实例,因为这非常消耗资源,而且效率很低。这时我应该建立一个连接池类,并且维护这个连接池类在全局下的单一实例(创建多个实例消耗资源,而且在特定情况下,单一实例更加方便程序进行处理。)每次使用的时候getInstance,并利用这个对象将数据写到缓存里,以方便之后统一建立连接和写入。

核心代码:这也是单例模式的类的一个标志,该类的构造方法是私有的。外部无法实例化。

在这个模式下,并发处理显得尤为重要。

常用的两种实现方法:

1.Classloader避免同步创建实例

public class Singleton {  
    private static Singleton instance = new Singleton();  
    private Singleton (){}  
    public static Singleton getInstance() {  
    return instance;  
    }  
}
//该代码摘自菜鸟教程
查看代码

2.使用双检锁(double-checked locking)

public class Singleton {  
    private volatile static Singleton singleton;  
    private Singleton (){}  
    public static Singleton getSingleton() {  
    if (singleton == null) {  
        synchronized (Singleton.class) {  
        if (singleton == null) {  
            singleton = new Singleton();  
        }  
        }  
    }  
    return singleton;  
    }  
}
//以上代码摘自菜鸟教程
查看代码

关于双检锁的一些知识:

一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。精确地说就是,优化器在用到这个变量时必须每次都小心地重新从主存读取这个变量的值,而不是使用保存在工作内存里的备份。(摘自百度百科)

一个参数可以既被const修饰,又被volatile修饰。它是volatile因为它可能被意想不到地改变。它是const因为程序不应该试图去修改它。

synchronized(){}表示一次加锁操作。锁定小括号内的对象,执行完代码块后解锁。

posted @ 2020-02-06 18:23  MayDayMemory  阅读(146)  评论(0)    收藏  举报