黑马程序员技术交流社区

标题: 不需要加锁,一样可是解决懒汉式安全问题?对吗 [打印本页]

作者: 月黑风高    时间: 2013-8-29 10:10
标题: 不需要加锁,一样可是解决懒汉式安全问题?对吗
本帖最后由 月黑风高 于 2013-8-29 12:17 编辑

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


作者: code_geass    时间: 2013-8-29 11:28
这个问题是在s=new Single()  如果A在s=new Single()之前停了。B进来也停了。当AB再开始运行时。分别new Single(),这就是2个对象了。 加锁是为了在整个共享代码之中都为单线程。
作者: 白磊    时间: 2013-8-29 11:30
不可以的,你应该是还没有真正理解懒汉式单例产生线程问题的原因吧。
因为        if(s==null)
                        s=new Single();
就是你写得这一句,在不同的线程来执行这段代码的时候,如果第一个线程执行到new Single();但是还正在给他分配内存的时候,另外一个线程也开始执行这个了,这个时候,s==null这个还是成立的,所以这不是就会产生两个  对象了,所以问题不是出在你写的return里面。
作者: 月黑风高    时间: 2013-8-29 11:38
白磊 发表于 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:41
月黑风高 发表于 2013-8-29 11:38
我自己懒汉式public static Single getInstance(){        return (s==null)?new Single():s;}
我想问 ...

(s==null)?new Single():s    和   if()语句完成的效果是一样的啊    ,它可以说只是if  else   语句的简写而已 。 明白?
作者: 范龙波    时间: 2013-8-29 11:45
帮你做了以下验证实验:


对三目运算底层实现原理我没有深入研究过,这个估计的反汇编才能知道.
如果推测:.三目运算只是简化if /else的书写.效率是一样的,如果不一样估计也是编译器的问题.
if /else 在执行的过程当中可能失去cpu执行权, 三目也会失去.

作者: 月黑风高    时间: 2013-8-29 11:47
白磊 发表于 2013-8-29 11:41
(s==null)?new Single():s    和   if()语句完成的效果是一样的啊    ,它可以说只是if  else   语句的 ...

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







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