单例模式,顾名思义就是只有一个实例,创建单例模式的步骤: 1私有构造方法,目的是不让程序随意创建对象。 2提供一个公共的静态方法,获取当前类的对象。因为私有化构造方法后,其他类就不能通过new创建该类对象了,所以只能通过类名.方法获取对象,所以方法为公共静态的。 3提供一个私有成员变量,就是本身的对象。 单例模式分为两种情况,饿汉式和懒汉式,饿汉式,懒汉式中的饿、懒是指创建对象的时机不同。
饿汉式,是指在随着类的加载而创建对象。
public class Singleton { PRivate Singleton(){ } private static Singleton s=new Singleton(); public static Singleton getInstance(){ return s; }}懒汉式,是指在调用方法时,创建对象。
public class Singleton2 { private Singleton2(){ } private static Singleton2 s=null; public static Singleton2 getInstance(){ if(s==null){ s=new Singleton2(); } return s; }}以上两种单例模式只能是在单线程情况下才是正确的,多线程情况下会出现安全问题。在多线程问题中应该加锁同步。
public class Singleton3 { private Singleton3() { }//双重锁模式,既保证了安全,又保证了效率 private static Singleton3 s = null; public static Singleton3 getInstance() { if (s == null) {//该if条件是为了提高程序效率,假如s不为空就不用进入同步。直接返回对象 synchronized (Singleton3.class) {//该处加同步,保证多线程情况下,对象的唯一 if (s == null) { s = new Singleton3(); } } } return s; }其实还有第三种单例模式
public class Singleton4 { private Singleton4(){ } public static final Singleton4 S=new Singleton4();}单线程情况下:饿汉式是空间换时间(推荐),懒汉式是时间换空间。 多线程情况下:饿汉式是没有安全隐患的,懒汉式可能会出现多个对象,造成安全隐患。
新闻热点
疑难解答