饿汉式: public class Singleton{ private static Singleton singleton = new Singleton (); private Singleton (){} public Singleton getInstance(){return singletion;} } 懒汉式: public class Singleton{ private static Singleton singleton = null; private Singleton (){} public static synchronized synchronized getInstance(){ if(singleton==null){ singleton = new Singleton(); } return singleton; } } 比较: 饿汉式是线程安全的,在类创建的同时就已经创建好一个静态的对象供系统使用,以后不在改变 懒汉式如果在创建实例对象时不加上synchronized则会导致对对象的访问不是线程安全的 从实现方式来讲他们最大的区别就是懒汉式是延时加载, 他是在需要的时候才创建对象,而饿汉式在虚拟机启动的时候就会创建, 使用的场合根据具体环境和个人习惯吧. 饿汉式单例类在自己被加载时就将自己实例化。即便加载器是静态的,在饿汉式单例 类被加载时仍会将自己实例化。单从资源利用效率角度来讲,这个比懒汉式单例类稍差些。 从速度和反应时间角度来讲,则比懒汉式单例类稍好些。然而,懒汉式单例类在实例化时, 必须处理好在多个线程同时首次引用此类时的访问限制问题,特别是当单例类作为资源控 制器,在实例化时必然涉及资源初始化,而资源初始化很有可能耗费时间。这意味着出现 多线程同时首次引用此类的机率变得较大。 饿汉式单例类可以在 Java 语言内实现,但不易在 C++内实现,因为静态初始化在 C++ 里没有固定的顺序,因而静态的 m_instance 变量的初始化与类的加载顺序没有保证,可能 会出问题。饿汉式单例类更符合 Java 语言本身的特点。

评论