设计模式之单例设计模式。

我们首先来了解下什么是java对象的状态,对象的状态通常有哪些。

Javadui对象的状态:

1、临时状态:临时状态是指刚刚new的对象,还没有保存到Session中的状态。

2、持久状态:已经被new的对象,保存在Session中的状态。

3、游离状态:已经被new的对象,没有保存在Session中的状态。

1. 什么是Java对象序列化

Java平台允许我们在内存中创建可复用的Java对象,但一般情况下,只有当JVM处于运行时,这些对象才可能存在,即,这些对象的生命周期不会比JVM的生命周期更长。但在现实应用中,就可能要求在JVM停止运行之后能够保存(持久化)指定的对象,并在将来重新读取被保存的对象。Java对象序列化就能够帮助我们实现该功能。

使用Java对象序列化,在保存对象时,会把其状态保存为一组字节,在未来,再将这些字节组装成对象。必须注意地是,对象序列化保存的是对象的"状态",即它的成员变量。由此可知,对象序列化不会关注类中的静态变量。

转载自:http://developer.51cto.com/art/201202/317181.htm

单例设计模式:

首先我们写一个简单的单例类:

[java] view plaincopy

public class Singleton { 

    /* 持有私有静态实例,防止被引用,此处赋值为null,目的是实现延迟加载 */ 

    private static Singleton instance = null; 

    /* 私有构造方法,防止被实例化 */ 

    private Singleton() { 

    } 

    /* 静态工程方法,创建实例 */ 

    public static Singleton getInstance() { 

        if (instance == null) { 

            instance = new Singleton(); 

        } 

        return instance; 

    } 

 

    /* 如果该对象被用于序列化,可以保证对象在序列化前后保持一致 */ 

    public Object readResolve() { 

        return instance; 

    } 

}

这是简单的单例模式,基本能满足设计要求,但是在实际的运行当中,如果放在多线程的运行环境下,肯定会出问题。那么我们需要对getInstace()方法使用synchronized 关键字保护起来代码如下:

public static  synchronized  Singleton   getInstance() { 

        if (instance == null) { 

            instance = new Singleton(); 

        } 

        return instance; 

    } 

但是,这样的用法会导致性能下降,因为每次diao调用getIntance方法都需要上锁一次。那么为了fang方便,我们通常会将synchronized 放在getIntance()方法里面来实现,对instance上锁:

public static Singleton   getInstance() { 

        if (instance == null) { 

synchronized (instance){

if (instance == null){

instance = new Singleton(); 

}

}

        return instance; 

    } 

虽然这样做在性能上会有所提升,但是依然会出现问题,因为java的对象创建和赋值是分开的,也就是所instance = new Sington(); 这个语句是分为了两部,所有在运行当中,可以能会出现一个线程在没有执行完毕的情况下执行了另外一个线程,就会出现没有初始instance对象没有初始化的状况,为了解决这个问题,前辈就有:

“单例模式使用内部类来维护单例的实现,JVM内部的机制能够保证当一个类被加载的时候,这个类的加载过程是线程互斥的。”

那么代码为:

public class Singleton { 

 

    /* 私有构造方法,防止被实例化 */ 

    private Singleton() { 

    } 

 

    /* 此处使用一个内部类来维护单例 */ 

    private static class SingletonFactory { 

        private static Singleton instance = new Singleton(); 

    } 

 

    /* 获取实例 */ 

    public static Singleton getInstance() { 

        return SingletonFactory.instance; 

    } 

 

    /* 如果该对象被用于序列化,可以保证对象在序列化前后保持一致 */ 

    public Object readResolve() { 

        return getInstance(); 

    } 

 

也有人这样实现:因为我们只需要在创建类的时候进行同步,所以只要将创建和getInstance()分开,单独为创建加synchronized关键字,也是可以的:

public class SingletonTest { 

 

    private static SingletonTest instance = null; 

 

    private SingletonTest() { 

    } 

 

    private static synchronized void syncInit() { 

        if (instance == null) { 

            instance = new SingletonTest(); 

        } 

    } 

 

    public static SingletonTest getInstance() { 

        if (instance == null) { 

            syncInit(); 

        } 

        return instance; 

    } 

 

 

感谢前辈的代码和经验,出处于文档,有错误请矫正。

原文大多为转载。

 

 

 

 

猜你喜欢

转载自blog.csdn.net/qq_37186247/article/details/82781660