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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 刘沙 中级黑马   /  2014-8-11 17:52  /  1805 人查看  /  13 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

        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就开始执行 这样岂不是会生成两个对象
还是一个线程如果有执行权正在执行 除非这个线程自己主动放弃执行权 要不然它就会一直执行?

点评

你说的情况是没有加同步之前的状况把!!!  发表于 2014-8-12 00:50

13 个回复

倒序浏览
你的mySingle方法上面加了锁,当线程A进来之后,其他线程是进不来的。只有当A出去了,其他才会进来。

评分

参与人数 1黑马币 +1 收起 理由
hejinzhong + 1 赞一个!

查看全部评分

回复 使用道具 举报
分析的完全正确!

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

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

锁是加在方法上的,非常安全。。。完全不会出现楼主所说的同时在new MySingle()处等待的情况
回复 使用道具 举报 1 0
fantacyleo 发表于 2014-8-11 18:03
锁是加在方法上的,非常安全。。。完全不会出现楼主所说的同时在new MySingle()处等待的情况 ...

层主,哪个老师教你的,让大家拉出来抽打一番……………………

点评

俺错了,加锁在方法上是抵消,并不会出错。脸肿了,去敷药……  发表于 2014-8-12 14:40
其实我是一直追随fantacyleo君  发表于 2014-8-11 23:59
那就需要探讨一下了。CPU运算速度太快,代码太短,根本看不出问题,先slepp一会。还有就是层主的试验代码能不能贴出来,鉴赏一下……  发表于 2014-8-11 18:23
我没有开玩笑  发表于 2014-8-11 18:14
回复 使用道具 举报
   说点个人浅见哈,你的程序运行到new对象的地方时即使失去了cpu运行权,但是他并不会释放锁的哦,那么你的这个程序重新开始运行时还是从当前持有锁的这个线程这儿开始运行走的啊,怎么会不安全呢?如果你在这个加锁的方法内使用wait方法的话那么才可能出现不安全的情况,因为wait方法会当前线程释放掉持有的锁并重新参与锁的竞争。因此我认为你这个方法是不会出现你想象中的那种情况的哦。。
回复 使用道具 举报
刘沙 中级黑马 2014-8-11 23:48:00
8#
jiangweibin2573 发表于 2014-8-11 17:56
你的mySingle方法上面加了锁,当线程A进来之后,其他线程是进不来的。只有当A出去了,其他才会进来。 ...

在讲消费者的时候 不是说一个线程执行到某个地方了 睡下了 别的线程就可以进来执行了吗
回复 使用道具 举报
上面都讲解得好清楚啊。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马