A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 程潇 中级黑马   /  2012-7-18 12:42  /  4090 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 程潇 于 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:
同步代码块和同步函数对于使用的锁都有什么限定?

评分

参与人数 1技术分 +1 收起 理由
蒋映辉 + 1 神马都是浮云

查看全部评分

7 个回复

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

单例设计模式只让创建一个对象,而调用这个对象是用类名调用,你这个对象跟类名不一样还怎么调用,这个对象就没意义了吧?我这么理解不知道对不对,我也是今天才学这个
回复 使用道具 举报
zhaosenyang 来自手机 黑马粉丝团 2012-7-18 19:09:06
报纸
创建类的对象,变量是类类型变量,在本类创建,变量类型就是类名SIngleton,而不能是其它吧。
回复 使用道具 举报
求解答~~~~~~~~~~~
回复 使用道具 举报
问题1:
synchronized (Singleton.class)  //这里的锁必须是Singleton.class吗?能否用自定义对象,例如Object obj = new Object(); 将obj作为锁

静态方法只能调用内存中已经存在的对象
因为这个类已经在内存中了,所以最好就用这个类作为锁.
回复 使用道具 举报
程潇 中级黑马 2012-7-20 15:09:42
8#
王龙彪 发表于 2012-7-20 14:46
静态方法只能调用内存中已经存在的对象
因为这个类已经在内存中了,所以最好就用这个类作为锁.
...

我在这个类中定义一个静态的Object对象,专门用来做锁,编译也是通过的
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马