黑马程序员技术交流社区

标题: 请教问题:关于懒汉式单例。 [打印本页]

作者: 李征雪    时间: 2012-4-15 15:24
标题: 请教问题:关于懒汉式单例。
  1. class Test
  2. {
  3.     private Test()
  4.     {
  5.         System.out.println("private");
  6.     }
  7.     static Test ts = null;
  8.     public static Test getTest()
  9.     {
  10.         return (null == ts ? ts = new Test() : null);
  11.     }
  12.     public void show()
  13.     {
  14.         System.out.println("hello private");
  15.     }
  16. }

  17. class DemoDanli
  18. {
  19.     public static void main(String[] args)
  20.     {
  21.         Test ts = Test.getTest();
  22.         ts.show();
  23.     }
  24. }
复制代码
请问第10行代码:return (null == ts ? ts = new Test() : null);这样写能否避免多线程访问产生的错误?是不是只要写一行代码就不会出错?


作者: 胡文杰    时间: 2012-4-15 15:44
不能,多线程问题是两个线程操作一个对象,就像两个人要操作一个门一样,一个要开门,一个要关门,你说结果这个门会怎么样呢?!如果这个对象有一个读和写的方法,要是两个同时操作的话,肯定是不行的!想要多线程安全就麻烦点加锁解锁!还有你的那句话我有点不太理解啊,逻辑有点不顺,你要判断的是ts 而非 null   我觉得这样写比较好:ts==null ? ts=new Tist():null;   ts 只能产生一个对象,如果ts !=null  那么肯定就是Tist 的对象了,所以,我觉得你这句话我看着有点别扭啊!还不如if(ts==null){ts = new Tist()}
作者: 马强    时间: 2012-4-15 16:01


单例设计防止创建过多对象,但是依然需要同步
作者: 陈扬    时间: 2012-4-15 16:18
本帖最后由 陈扬 于 2012-4-15 16:19 编辑

你的代码不是单例模式
修改后后代码如下:
  1. class Test
  2. {
  3.     private Test()
  4.     {
  5.         System.out.println("private");
  6.     }
  7.     static Test ts = null;
  8.     public static Test getTest()
  9.     {
  10.             if(ts==null){ ts=new Test();}return ts;
  11.         //return (ts ==  null? ts = new Test() : null);/*返回结果*/
  12.     }
  13.     public void show()
  14.     {
  15.         System.out.println("hello private");
  16.     }
  17. }
  18. public class DemoDanli
  19. {
  20.     public static void main(String[] args)
  21.     {
  22.         Test ts = Test.getTest();
  23.         ts.show();
  24.         Test ts1 = Test.getTest();
  25.         //判断是不是同一个对象
  26.         System.out.println(ts==ts1);/*return (ts ==  null? ts = new Test() : null);返回结果为false*/
  27.                                                                 /*if(ts==null){ ts=new Test();}return ts;返回结果为true*/
  28.     }
  29. }
复制代码





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