黑马程序员技术交流社区

标题: 单列多线程 [打印本页]

作者: 刘沙    时间: 2014-8-11 17:52
标题: 单列多线程
        public static synchronized MySingle getInstance(){
                if(s==null){//
                        //->a    ->b
                        s=new MySingle();
                }
                return s;
        }
这个是单列的多线程:
会不会有这种情况 当我加锁了 但是我的a b线程还是都睡在了s=new MySingle();之前 ,当a睡下了 b就开始执行 b也睡在那里 当a醒的时候 往下执行 执行完了 b醒了 b就开始执行 这样岂不是会生成两个对象
还是一个线程如果有执行权正在执行 除非这个线程自己主动放弃执行权 要不然它就会一直执行?
作者: jiangweibin2573    时间: 2014-8-11 17:56
你的mySingle方法上面加了锁,当线程A进来之后,其他线程是进不来的。只有当A出去了,其他才会进来。
作者: wisely    时间: 2014-8-11 17:58
分析的完全正确!

所以说多线程情况下,这样加锁是不安全的。要加在里面,多重判断。话说你看的是谁的视频,难道这个都讲不到?毕老师的视频肯定讲到了,我替毕老师作证!
作者: mr.yang    时间: 2014-8-11 17:59
你前面加了锁,a和b只能进来一个,假如a执行完了才会释放锁,b才能进来执行,b进来的时候判断s不是空了就不创建对象了,直接return,所以只能创建一个对象。
作者: fantacyleo    时间: 2014-8-11 18:03
wisely 发表于 2014-8-11 17:58
分析的完全正确!

所以说多线程情况下,这样加锁是不安全的。要加在里面,多重判断。话说你看的是谁的视频 ...

锁是加在方法上的,非常安全。。。完全不会出现楼主所说的同时在new MySingle()处等待的情况
作者: wisely    时间: 2014-8-11 18:08
fantacyleo 发表于 2014-8-11 18:03
锁是加在方法上的,非常安全。。。完全不会出现楼主所说的同时在new MySingle()处等待的情况 ...

层主,哪个老师教你的,让大家拉出来抽打一番……………………
作者: 怀念黑海岸    时间: 2014-8-11 19:11
   说点个人浅见哈,你的程序运行到new对象的地方时即使失去了cpu运行权,但是他并不会释放锁的哦,那么你的这个程序重新开始运行时还是从当前持有锁的这个线程这儿开始运行走的啊,怎么会不安全呢?如果你在这个加锁的方法内使用wait方法的话那么才可能出现不安全的情况,因为wait方法会当前线程释放掉持有的锁并重新参与锁的竞争。因此我认为你这个方法是不会出现你想象中的那种情况的哦。。
作者: 刘沙    时间: 2014-8-11 23:48
jiangweibin2573 发表于 2014-8-11 17:56
你的mySingle方法上面加了锁,当线程A进来之后,其他线程是进不来的。只有当A出去了,其他才会进来。 ...

在讲消费者的时候 不是说一个线程执行到某个地方了 睡下了 别的线程就可以进来执行了吗
作者: masai158    时间: 2014-8-11 23:56
上面都讲解得好清楚啊。




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