单例模式--饿汉式、懒汉式、线程安全的懒汉式、高性能安全的懒汉式

深入学习单例设计模式

饿汉式单例:开发时较为常用。

class Single1 {
	private Single1(){}
	private static Single1 single = new Single1();
	public static Single1 getInstance() {
 	      return single;
	}
	public static void main(String[] args) {
		Single1 s = Single1.getInstance();
		Single1 s1 = Single1.getInstance();
		System.out.println(s==s1);
	}
}

多线程会出现问题的懒汉式单例:

class Single2{
private Single2(){}
private static Single2 single = null;
public static Single2 getInstance(){
if (single == null) {
single = new Single2();
}
return single;
}
public static void main(String[] args) {
Single2 s = Single2.getInstance();
Single2 s1 = Single2.getInstance();
System.out.println(s==s1);
}
}

 解决多线程安全问题的懒汉式单例

class Single3{
private Single3(){}
private static Single3 single = null;
public static synchronizedSingle3 getInstance(){
if (single == null) {
single = new Single3();
}
return single;
}
public static void main(String[] args) {
Single3 s = Single3.getInstance();
Single3 s1 = Single3.getInstance();
System.out.println(s==s1);
}
}

懒汉式的目的是为了提高性能,synchronized却降低了性能

class Single4{
private Single4(){}
private static Single4 single = null;
public static Single4 getInstance(){
if (single == null) {
synchronized(Single4.class) {
if (single == null)
{
single = new Single4();
}
}
}
return single;
}
public static void main(String[] args) {
Single4 s = Single4.getInstance();
Single4.s1 = Single4.getInstance();
System.out.println(s==s1);
}
}

比较推荐的还是第一种饿汉式单例(Hibernate4中官方源码):

public class HibernateUtil {

    private static final SessionFactory sessionFactory = buildSessionFactory();

    private static SessionFactory buildSessionFactory() {
        try {
            // Create the SessionFactory from hibernate.cfg.xml
            new Configuration().configure().buildSessionFactory(
			    new StandardServiceRegistryBuilder().build() );
        }
        catch (Throwable ex) {
            // Make sure you log the exception, as it might be swallowed
            System.err.println("Initial SessionFactory creation failed." + ex);
            throw new ExceptionInInitializerError(ex);
        }
    }

    public static SessionFactory getSessionFactory() {
        return sessionFactory;
    }

}

未完待续...

时间: 2024-09-15 12:58:22

单例模式--饿汉式、懒汉式、线程安全的懒汉式、高性能安全的懒汉式的相关文章

单例饿汉为什么是线程安全的

问题描述 单例饿汉为什么是线程安全的 我不明白为什么饿汉式是线程安全的,在我想来,饿汉的对象属于类成员,而非方法成员,那么就有可能发生争夺成员资源的现象呀. //饿汉式单例类.在类初始化时,已经自行实例化 public class Singleton1 { private Singleton1() {} private static final Singleton1 single = new Singleton1(); //静态工厂方法 public static Singleton1 getI

Java实现单例模式之饿汉式、懒汉式、枚举式_java

单例模式的实现(5种) 常用: 饿汉式(线程安全,调用效率高,但是不能延时加载) 懒汉式(线程安全,调用效率不高,可以延时加载) 其他: 双重检测锁式(由于jvm底层内部模型原因,偶尔会出问题,不建立使用) 静态内部类式(线程安全,调用效率高,但是可以延时加载) 枚举单例(线程安全,调用效率高,不能延时加载) 饿汉式单例具体代码如下: package com.lcx.mode; /** * * 饿汉式单例,不管以后用不用这个对象,我们一开始就创建这个对象的实例, * 需要的时候就返回已创建好的实

(单例设计模式中)懒汉式与饿汉式在多线程中的不同

/*  目的:分析一下单例设计模式中,懒汉式与饿汉式在多线程中的不同!  开发时我们一般选择饿汉式,因为它简单明了,多线程中不会出现安全问题!  而饿汉式需要我们自己处理程序中存在的安全隐患,但是饿汉式的程序技术含量更高! */ /* class SinglePerson implements Runnable{    private static SinglePerson ss = new SinglePerson("hjz", 22);//恶汉式    private int ag

饿汉式的非延迟实例化对象怎么理解

问题描述 classSingleton{privatestaticSingletoninstance=newSingleton();privateSingleton(){}publicstaticSingletongetInstance(){returninstance;}} 在没有类初始化之前newSingleton()应该是不会被实例化.是由当<cinit>方法触发即类初始化进行时才会new.而类主动初始化仅有的如下几种情况,详见<深入理解java虚拟机>7.2节类加载的时机1

老生常谈C++的单例模式与线程安全单例模式(懒汉/饿汉)_C 语言

1 教科书里的单例模式 我们都很清楚一个简单的单例模式该怎样去实现:构造函数声明为private或protect防止被外部函数实例化,内部保存一个private static的类指针保存唯一的实例,实例的动作由一个public的类方法代劳,该方法也返回单例类唯一的实例. 上代码: class singleton { protected: singleton(){} private: static singleton* p; public: static singleton* instance()

从java.lang.Runtime看单例懒汉饿汉模式的选择

单例模式有懒汉和饿汉模式,代码就不在此赘述了.懒汉模式会带来线程安全的问题,所以一般采用饿汉模式.从Java的源代码中也可看出应该选择饿汉模式. public class Runtime {     private static Runtime currentRuntime = new Runtime();     public static Runtime getRuntime() {            return currentRuntime;     }     private Ru

link中什么样的查询叫懒汉模式,什么查询又叫饿汉模式?

问题描述 link中什么样的查询叫懒汉模式,什么查询又叫饿汉模式? link中什么样的查询叫懒汉模式,什么查询又叫饿汉模式? 解决方案 我们通常管它们叫懒惰加载和贪婪加载.好比 class User { int id; public List Friends { get { return db.Friends.Where(x => x.FriendID == id).ToList(); } } } 这个就是懒惰加载 class User { int id; List friendlist = d

java-求助!不理解为什么workPane为null,从而导致空指针 单例为饿汉变种型

问题描述 求助!不理解为什么workPane为null,从而导致空指针 单例为饿汉变种型 解决方案 AuthorityModel.getInstance()这个有没有得到值,这个要看你的源代码 解决方案二: 下面注释部分的代码可用,说明AuthorityModel.getInstance()是可以得到值的,区别在于为什么变成成员属性反而得不到值,临时变量确可以获得值?

在企业开发中,一般用link的饿汉模式多还是懒汉模式多一点?

问题描述 在企业开发中,一般用link的饿汉模式多还是懒汉模式多一点? 在企业开发中,一般用link的饿汉模式多还是懒汉模式多一点? 解决方案 如果你看ef自己生成的代码,大部分都是lazyload,因为导航属性没必要加载进来,既浪费性能也没有必要. 解决方案二: 当然是根据需要来.不好说谁多谁少.事实上根据2-8法则,20%的代码反倒是更关键,你说呢.