黑马程序员技术交流社区
标题:
请教问题:关于懒汉式单例。
[打印本页]
作者:
李征雪
时间:
2012-4-15 15:24
标题:
请教问题:关于懒汉式单例。
class Test
{
private Test()
{
System.out.println("private");
}
static Test ts = null;
public static Test getTest()
{
return (null == ts ? ts = new Test() : null);
}
public void show()
{
System.out.println("hello private");
}
}
class DemoDanli
{
public static void main(String[] args)
{
Test ts = Test.getTest();
ts.show();
}
}
复制代码
请问第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
1.jpg
(25.73 KB, 下载次数: 19)
下载附件
2012-4-15 16:00 上传
单例设计防止创建过多对象,但是依然需要同步
作者:
陈扬
时间:
2012-4-15 16:18
本帖最后由 陈扬 于 2012-4-15 16:19 编辑
你的代码不是单例模式
修改后后代码如下:
class Test
{
private Test()
{
System.out.println("private");
}
static Test ts = null;
public static Test getTest()
{
if(ts==null){ ts=new Test();}return ts;
//return (ts == null? ts = new Test() : null);/*返回结果*/
}
public void show()
{
System.out.println("hello private");
}
}
public class DemoDanli
{
public static void main(String[] args)
{
Test ts = Test.getTest();
ts.show();
Test ts1 = Test.getTest();
//判断是不是同一个对象
System.out.println(ts==ts1);/*return (ts == null? ts = new Test() : null);返回结果为false*/
/*if(ts==null){ ts=new Test();}return ts;返回结果为true*/
}
}
复制代码
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2