`
阅读更多
饿汉式:
//饿汉式是线程安全的,在类创建的同时就已经创建好一个静态的对象供系统使用,以后不在改变,
//这种单利模式比较简单,也比较可靠,唯一不足就是无法对singleton实例做延迟加载。
public class Singleton{
	private static Singleton singleton = new Singleton ();
	private Singleton (){
            System.out.println("这里创建单例过程可能会比较慢");
        }
	public static Singleton getInstance(){
            return singletion;
        }
        public static void createStringTask(){
            System.out.println("这是模拟单例其他任务操作");
        }
} 
//*输出结果为:这里创建单例过程可能会比较慢
               这是模拟单例其他任务操作
//*从输出结果我们可以看到,虽然并没有使用单例类,但它还是被创建出来了,这也许是开发人员所不
   愿意看到的。为了解决这个问题,并以此提高系统在相关函数调用时反应的速度,就需要下面的延迟
   加载方式来解决以上问题。
       
懒汉式:
//懒汉式如果在创建实例对象时不加上synchronized则会导致对对象的访问不是线程安全的。
//他是在需要的时候才创建对象,而饿汉式在虚拟机启动的时候就会创建。
public class LazySingleton{
	private static LazySingleton lazySingleton = null;
        pirvate LazySingleton(){
            System.out.printl("这里创建单例很慢");
        }
	public static synchronized getInstance(){
		 if(lazySingleton==null){
			 lazySingleton = new LazySingleton();
		 }
		return lazySingleton;
	}
} 
//*首先对静态成员变量lazySingleton初始值赋予null,确保系统启动时没有额外的负载;其次
   在getInstance时先判断lazySIngletons是否存在,若存在返回,步存在就在建立实例,需要注意的
   是getInstance方法必须是synchronized的,否则在多线程的环境下, 但线程1正在运行时,完成赋值
   操作前,线程2可能判断lazySingleton没有创建,线程2也将启动新建单例的程序,这样就导致多个
   实例被创建,所以synchronized是必须的!使用上面的例子虽然实现了单例的延时加载,使用了同步
   关键字,这在多线程环境下性能大大减弱,所以我们在优化下代码如下:

public class LazySingleton{
	pirvate LazySingleton(){
		System.out.printl("这里创建单例很慢");
	}
	private static class SingletonUtil{
		private static LazySingleton instace = new LazySingleton();
	}
	public static LazySingleton getInstace(){
		return SingletonUtil.instace;
	}
} 
//*在这种方式中,单例模式使用的内部静态类来维护自己的实例,当加载当前类的时候,其内部类,不
   会被初始化,由于由于实例的建立是在类加载完成的,所以对多线程也是安全的,这里我们没有用
   synchronized关键字,因此这种方式兼备以上两种方式的优点!

 

1
1
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics