java笔记 单例模式

来源:互联网 发布:淘宝津贴是什么意思 编辑:程序博客网 时间:2024/06/05 11:25

----------- android培训、java培训、java学习型技术博客、期待与您交流! ------------

单例模式:顾名思义,就是让程序使用者只在任何时候就只能创建一个实例化对象。

基本实现思想:

1.不能让其他类随便建立该类的对象

2.同时可以在本类中生产一个自己的对象

3.可以对外提供获取本类中以生产的对象的方法

这样就可以保证,本类的对象在堆内存中只有一个,而对其的引用可以有多个,可以用一下代码来体现:

public class TestSingle {public static void main(String[] args) {Single s1 = Single.getInstnce();Single s2 = Single.getInstnce();s1.setName("aaa");System.out.println(s2.getName());}}class Single {/** * 为了保证其他类不能创建本类对象,将对应构造函数私有化即可(这里以空参数构造函数为例) */private Single() {}/** * 在本类中创建一个本类的对象,设置为静态是因为下面的方法, 因为方法不能通过对象打点方式调用,故只能是静态的,故此处s对象为静态对象 */private static Single s = new Single();/** * 此方法是对外提供的,故其权限为public,又因其不能通过对象打点方式调用, 故为静态的,故s对象也为静态的 *  * @return s对象 */public static Single getInstnce() {return s;}/** * 为了检验,此处给一变量和其封装方法 */private String name;public String getName() {return name;}public void setName(String name) {this.name = name;}}

以上是单例模式中的一种实现形式,习惯上称之为饿汉式。

还有一种实现方式,称之为懒汉式,代码如下(为了突出表示,省去部分代码):

class Single {/** * 为了保证其他类不能创建本类对象,将对应构造函数私有化即可(这里以空参数构造函数为例) */private Single() {}/** * 此处并未真正创建对象,而是创建了一个空引用 */private static Single s = null;/** * 此方法是对外提供的,故其权限为public,又因其不能通过对象打点方式调用, 故为静态的,故s对象也为静态的 *  * @return s对象 */public static Single getInstnce() {//s为空时才在这里创建对象if (s == null) {s = new Single();}return s;}}

饿汉式与懒汉式的不同之处在于,是否在类加载的时候就创建对象了,饿汉式在类加载的过程中就直接创建对象了,而懒汉式知道调用方法时才创建。

除了以上的区别外,饿汉式是线程安全的,故企业开发中常用,而懒汉式是非线程安全的,可以做以下改进:

 

class Single {/** * 为了保证其他类不能创建本类对象,将对应构造函数私有化即可(这里以空参数构造函数为例) */private Single() {}/** * 此处并未真正创建对象,而是创建了一个空引用 */private static Single s = null;/** * 此方法是对外提供的,故其权限为public,又因其不能通过对象打点方式调用, 故为静态的,故s对象也为静态的 *  * @return s对象 */public static Single getInstnce() {// s为空时才在这里创建对象if (s == null) {//在此处加同步锁即可synchronized (Single.class) {s = new Single();}}return s;}}


 

安全机制即为在创建对象的时候运用双重判断,并在内层判断中加同步锁,也可在方法上直接加同步锁而方法内只进行一次判断,但同步锁会带来低效问题,且方法上加锁的话,每次都得进行加锁操作,为了减少加锁带来的低效问题,故使用双重判断并在内层判断中加同步锁以减少加锁次数。


总结:显然,我们使用单例是为了使用单例所产生的对象,所以一般情况下开发用饿汉式!


 

原创粉丝点击