饿汉,懒汉,都是单身汉!---->简说单例模式里两个基友间的二三事

来源:互联网 发布:淘宝二手单反相机 编辑:程序博客网 时间:2024/05/19 05:03
</pre><pre name="code" class="html">

package Java中的设计模式的实例;
//单例模式:只允许,且只要一个实例对象就好!比如老婆
//单例模式之饿汉模式Singleton01
public class Singleton01 {
//1.私有化构造函数,防止外部对象通过构造函数创建其实例
private Singleton01(){

}
//2.在其本类中创建其自身的唯一实例
private static Singleton01 instance=new Singleton01();

//3.对外部题提供一个方法,让它们能有机会来访问到实例对象
//就是给它们个能够膜拜的机会!
public static Singleton01 getInstance(){
return instance;
}
}

------------------------------------------------------------------------------------------------------

package Java中的设计模式的实例;
//单例模式实现之懒汉模式
public class Singleton02 {
//也是分为三个步骤,不同的地方只是自身单例生成情况的不同
//1.构造函数私有化,作用跟饿汉模式的相同
private Singleton02(){

}
//2.创建自身的单例实例对象---->懒汉模式的特点之一:不会直接加载
private static Singleton02 instance;

//3.懒人也要给别人合作的机会,不然还怎么愉快的玩耍啦!
//这里用的static方法即是为了方便别人的调用,也是为了加载时考虑
public static Singleton02 getInstance(){
if(instance==null){
//懒汉模式的特点之二:就是为空的时候,才会做事情--->干加载对象的活儿
instance=new Singleton02();
}
return instance;
}
}

------------------------------------------------------------------------------------------------------

package Java中的设计模式的实例;
/*
 * 测试结果说明:
 * 两个示例的对象都是指向的同一个;
 * 这个跟用静态修饰的自身实例对象是由关系。
 * 由static生成的对象,在内存中用到的是同一方的内存空间。那些操作都是在同一空间上
 * 来运行的。
 * 两者的区别就在于运行效率和线程的问题上:
饿汉模式:它是加载时慢,运行时快。加载的时候,因为是static修饰的自身实例对象,static修饰的在编译完成后,就是你保存的那会儿就已经生成好了。蓄势待发,就等你运行命令的发出!于是,到了运行时,它的速度自然就快。再一个就是,它是线程安全的,具体的原因还得分到线程的知识点去细说。
 * 这里个人的看法就是:因为static的关系,饿汉模式在编译完成(就是你保存了编写修改的程序后)时就完成了自身实例对象的加载。而多线程来使用它时是在运行时的时间线上来进行的。两者生成时间上分隔开的。所以不会受到影响。但是多线程的情况下,这个实例对象不是被大家所共用吗?
 是的。static自己默认自带有互斥的机制么?----->求解答

 * 
懒汉模式:加载时快,运行时慢。这是一个相对来讲的说法。加载时快,是因为在编译完成时,因为并没有指明自身实例对象需要创建,而编译完成时getInstance()方法也只是生成了一个框架,就是有了这么一个工具。运行的时候,这个工具才能发挥它的作用。这样的情况下,懒汉模式就直接跳过了创建对象的过程,加载时当然就快。运行时慢是怎么回事呢??运行时,工具可以发挥作用了。如果已经有了instance实例就会直接返回,这到还好。
【不管怎样,懒汉模式创建的第一个对象一般都是空的】。如果没有,它还得重新创建一个出来。创建肯定就会消耗时间。在表现上来说就是运行时慢了。还有一点,懒汉模式是线程不安全的。不安全的原因就是因位运行时创建对象这么一种情况(多线程间的运行情况是交叉运行的,在某个方法或者某个对象里就可能出现把-2当成-1来用的情况)。【具体的是不是,还有待查证,目前来说,这只是猜测】
 *
 *懒汉,饿汉它俩能够给你的体验就是:
 *懒汉是程序初始化时贼快,在程序运行时就有点蔫了;饿汉是在程序初始化时力不从心,在程序运行时蹭蹭几下,让你享受飞一般的感觉!
 * 【上述内容是小人的拙见,还望您能多多指教!】
 */
public class SingletonTest {
public static void main(String[] args) {
//饿汉模式示例
Singleton01 instance01=Singleton01.getInstance();
Singleton01 instance02=Singleton01.getInstance();
if(instance01==instance02){
System.out.println("它俩是同一个---》饿汉");
}
else{
System.out.println("它俩不是同一个---》饿汉");
}
//懒汉模式示例
Singleton02 instance03=Singleton02.getInstance();
Singleton02 instance04=Singleton02.getInstance();
if(instance03==instance04){
System.out.println("它俩是同一个---》懒汉");
}
else{
System.out.println("它俩不是同一个---》懒汉");
}
}
}

------------------------------------------------------------------------------------------------------


微笑谢谢你能看到这里,(*^__^*) 嘻嘻……微笑】 */}

关于设计模式的江湖,这里有更多。。。

23种爆款,总有一款适合心,符你意

http://blog.csdn.net/doymm2008/article/details/13288067#comments

(。・∀・)ノ゙有代码的地方,就有江湖.....

请无视--------】


1 0