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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

  1. class single
  2. {
  3.         private static Single s = null;
  4.         private Single(){}

  5.         public static Single getInstance()
  6.         {
  7.                 if(s==null)
  8.                 {
  9.                         synchronized(Single.class)
  10.                         {
  11.                                 if(s==null)
  12.                                         s=new Single();
  13.                         }
  14.                 }
  15.                 return s;
  16.         }
  17. }
复制代码

9 个回复

正序浏览
懒汉式存在 线程安全问题,一般用同步方法、同步代码快或上锁 来解决,单例模式,一般推荐饿汉式
回复 使用道具 举报
这个是懒汉式。它会出现线程安全隐患。因为当一个线程判断对象不存在它就创建可是对象还没有赋上值。其它的线程进进来了。判断的值也为空,也创建了一个,这样在内存中就有两个对象。所以要把这段代码产生互斥。即同时只能由一个线程执行这段代码。并且互斥的时候使用的监视器对象是当前类的字节码文件对象。

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

回复 使用道具 举报
synchronized方法需要一个锁用于线程调度时的线程锁定,
你这里同步的代码段位于静态方法中,
因此此时的线程调度锁只能是synchronized(Single.class),
因为说class文件是中只有一份,

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

回复 使用道具 举报
synchronized(Single.class)里面的参数是一个Class类对象,用来控制同步的
回复 使用道具 举报
静态进内存时,内存中没有本类对象,但是一定有该类对应的字节码文件对象,类名.class,该对象的类型是Class。
静态的同步方法,使用的锁是该方法所在类的字节码文件对象,类名.class。
synchronized(Single.class),读这句是判断锁。
如果 s=new Single();这步已经做了,再来一个线程就直接拿对象用,不能再new对象了,保证对象的唯一性。

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

回复 使用道具 举报
标记同步代码块,在这里保证了只创建一个对象,
懒汉式是说在single中定义了对象,但是并没有实例化,有代码可以看得出,当s为空时,此时就有一个线程获得同步锁并创建出此实例对象,其他线程无法操作,当该线程释放同步锁后,其他的线程也不会去执行同步代码块,因为此时地一个if条件已经不满足了、、、所以保证了single永远都只被创建一次

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

回复 使用道具 举报
同步代码块,当一个线程执行的时候别的线程就不能执行,毕老师说过,Single.class就相当于一个锁,只要single这个类一加载进去内存,这个锁就可以用了。
回复 使用道具 举报
同步代码块中的锁,当有一个线程执行同步代码块时,别的线程就不能执行此代码块,有没有现在在执行就看Single.class这个参数了
回复 使用道具 举报
同步代码用的,防止多线程操作时出现异常,目的就是一个线程在执行 if(s==null)
                                        s=new Single();时,另一个线程进不来
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马