黑马程序员技术交流社区

标题: 关于单例类中懒汉式的安全问题 [打印本页]

作者: 嘿~~    时间: 2014-8-15 09:09
标题: 关于单例类中懒汉式的安全问题
昨晚看到懒汉式在创建对象时,如果被多个线程同时访问,会存在安全隐患,写出一个小代码,验证一下毕老师的解决方法。
  1. class SingleThread extends Thread
  2. {
  3.         public void run(){
  4.                 //每个线程循环创建Single类的对象
  5.                 for (int i =0;i<100 ;i++ )
  6.                 {
  7.                         Single s = Single.getInstance();
  8.                         //所有s的哈希值完全一样
  9.                         System.out.println(Thread.currentThread().getName()+"--->>>"+s.hashCode());
  10.                 }
  11.         }
  12.         public int hashCode(){
  13.                 return this.hashCode();
  14.         }
  15.         public static void main(String[] args)
  16.         {
  17.                 //开启多个线程验证Single类的getInstance()方法是否存在安全隐患
  18.                 new SingleThread().start();
  19.                 new SingleThread().start();
  20.                 new SingleThread().start();
  21.                 new SingleThread().start();
  22.         }
  23. }
  24. class Single
  25. {
  26.         private static Single s = null;
  27.         private Single(){}
  28.         public static Single getInstance(){
  29.                 if (s==null)//此处判断一下,可以提高效率
  30.                 {
  31.                         synchronized(Single.class)//此处加锁,只允许一个线程访问创建对象
  32.                         {
  33.                                 if(s==null)
  34.                                         s = new Single();       
  35.                         }       
  36.                 }
  37.                 return s;
  38.         }
  39. }
复制代码


代码如上。不知可行否,还望高手予以指教!
作者: 嘿~~    时间: 2014-8-15 09:11
  1. Thread-0--->>>25699763
  2. Thread-0--->>>25699763
  3. Thread-0--->>>25699763
  4. Thread-0--->>>25699763
  5. Thread-0--->>>25699763
  6. Thread-1--->>>25699763
  7. Thread-1--->>>25699763
  8. Thread-1--->>>25699763
  9. Thread-1--->>>25699763
  10. Thread-1--->>>25699763
  11. Thread-1--->>>25699763
  12. Thread-1--->>>25699763
  13. Thread-1--->>>25699763
  14. Thread-1--->>>25699763
  15. Thread-0--->>>25699763
  16. Thread-1--->>>25699763
  17. Thread-0--->>>25699763
  18. Thread-0--->>>25699763
  19. Thread-0--->>>25699763
  20. Thread-0--->>>25699763
  21. Thread-0--->>>25699763
  22. Thread-0--->>>25699763
  23. Thread-0--->>>25699763
  24. Thread-0--->>>25699763
  25. Thread-0--->>>25699763


复制代码
部分输出打印结果,可以看到多个线程创建对象的哈希值完全一样,
作者: yuli2039    时间: 2014-8-15 18:22
懒汉式单例的代码没啥问题,返回的哈希值都是一样的,说明对象相同。不过你这复写的hashCode方法和没复写不是一样的么?没有加入自己的算法,还是直接返回该对象的hash值
作者: 黑马_java猿    时间: 2014-8-16 08:52
多线程  会有不安全问题   不过有解决方式 老师讲过 但是我忘了




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