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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 月黑风高 于 2013-8-29 12:17 编辑

public static Single getInstance()
{
                /*
                if(s==null)
                        s=new Single();
                */
                return (s==null)?new Single():s;
}
线程安全问题产生的原因:
1.多个线程在操作共享的数据
2.操作共享数据的代码不止一条!
请问:利用三元运算符可以避免以上的线程安全问题吗?

6 个回复

倒序浏览
这个问题是在s=new Single()  如果A在s=new Single()之前停了。B进来也停了。当AB再开始运行时。分别new Single(),这就是2个对象了。 加锁是为了在整个共享代码之中都为单线程。
回复 使用道具 举报
不可以的,你应该是还没有真正理解懒汉式单例产生线程问题的原因吧。
因为        if(s==null)
                        s=new Single();
就是你写得这一句,在不同的线程来执行这段代码的时候,如果第一个线程执行到new Single();但是还正在给他分配内存的时候,另外一个线程也开始执行这个了,这个时候,s==null这个还是成立的,所以这不是就会产生两个  对象了,所以问题不是出在你写的return里面。
回复 使用道具 举报
白磊 发表于 2013-8-29 11:30
不可以的,你应该是还没有真正理解懒汉式单例产生线程问题的原因吧。
因为        if(s==null)
            ...

传统的非安全懒汉式
public static Single getInstance()
{
                if(s==null)
                        s=new Single();
}


我自己懒汉式
public static Single getInstance()
{
        return (s==null)?new Single():s;
}

我想问的是我自己的写的懒汉式完全避免了多线程产生的原因
1.多个线程在操作共享的数据
2.操作共享数据的代码不止一条!(我只写了一条)
我用多线程运行测试的时候也没有问题,
请问这种做法到底行不行?如果不行,什么情况下会出错?

回复 使用道具 举报
月黑风高 发表于 2013-8-29 11:38
我自己懒汉式public static Single getInstance(){        return (s==null)?new Single():s;}
我想问 ...

(s==null)?new Single():s    和   if()语句完成的效果是一样的啊    ,它可以说只是if  else   语句的简写而已 。 明白?
回复 使用道具 举报
帮你做了以下验证实验:


对三目运算底层实现原理我没有深入研究过,这个估计的反汇编才能知道.
如果推测:.三目运算只是简化if /else的书写.效率是一样的,如果不一样估计也是编译器的问题.
if /else 在执行的过程当中可能失去cpu执行权, 三目也会失去.
回复 使用道具 举报 1 0
白磊 发表于 2013-8-29 11:41
(s==null)?new Single():s    和   if()语句完成的效果是一样的啊    ,它可以说只是if  else   语句的 ...

截图证明这种情况下会错误就行!


回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马