黑马程序员技术交流社区

标题: 关于单例模式中懒汉式的锁 [打印本页]

作者: 程潇    时间: 2012-7-18 12:42
标题: 关于单例模式中懒汉式的锁
本帖最后由 程潇 于 2012-7-18 12:51 编辑

class Singleton{
        private static Singleton singleton = null;
        private Singleton(){}
        public static Singleton getInstance(){
                if(singleton==null){
                        synchronized (Singleton.class) {
                                if(singleton==null)
                                        singleton = new Singleton();
                        }
                }
                return singleton;
        }
       
}

问题1:
synchronized (Singleton.class)  //这里的锁必须是Singleton.class吗?能否用自定义对象,例如Object obj = new Object(); 将obj作为锁

问题2:
同步代码块和同步函数对于使用的锁都有什么限定?

作者: 柯玲    时间: 2012-7-18 13:06
必须是Singleton.class,不能为Object类型的变量。
1.先从内存角度来说:
因为getInstance()是静态方法,Singleton的类变量singleton也用static修饰,它们都随类的创建存在于栈内存中。
而Object类的变量是对象创建以后进入堆内存的。二者的位置都不一样,怎么关联上?
2.从程序的角度来说,
共享资源singleton和方法getInstance()都是static的,Singleton类进内存的时候先封装成字节码文件对象,接着共享资源singleton进入内存也变成一个字节码文件对象。
在这个区域里面没有本类对象,但是一定有类对应的字节码文件对象存在,而类的字节码又只有一份,所以用Singleton.class作为同步锁
作者: 程潇    时间: 2012-7-18 13:22
如果在Singleton中定义一个静态的对象呢?
static Object obj = new Object();
作者: zhaosenyang    时间: 2012-7-18 18:53
程潇 发表于 2012-7-18 13:22  如果在Singleton中定义一个静态的对象呢?  static Object obj = new Object();

单例设计模式只让创建一个对象,而调用这个对象是用类名调用,你这个对象跟类名不一样还怎么调用,这个对象就没意义了吧?我这么理解不知道对不对,我也是今天才学这个
作者: zhaosenyang    时间: 2012-7-18 19:09
创建类的对象,变量是类类型变量,在本类创建,变量类型就是类名SIngleton,而不能是其它吧。
作者: 程潇    时间: 2012-7-20 14:34
求解答~~~~~~~~~~~
作者: 王龙彪    时间: 2012-7-20 14:46
问题1:
synchronized (Singleton.class)  //这里的锁必须是Singleton.class吗?能否用自定义对象,例如Object obj = new Object(); 将obj作为锁

静态方法只能调用内存中已经存在的对象
因为这个类已经在内存中了,所以最好就用这个类作为锁.

作者: 程潇    时间: 2012-7-20 15:09
王龙彪 发表于 2012-7-20 14:46
静态方法只能调用内存中已经存在的对象
因为这个类已经在内存中了,所以最好就用这个类作为锁.
...

我在这个类中定义一个静态的Object对象,专门用来做锁,编译也是通过的




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2