java吧 关注:1,241,013贴子:12,712,298

关于线程的互斥锁问题。求解为什么打印的都是1000;

只看楼主收藏回复





IP属地:江苏1楼2014-12-07 19:00回复
    他应该输出什么呢


    2楼2014-12-07 20:50
    收起回复
      我猜因为 Thread.sleep 睡眠的时候方法也抱着那个锁的 所以主线程先打印一个 1000 然后m1打印 1000 最后 m1 锁释放了 , m2 方法 才进行 b被改为 2000


      IP属地:河南4楼2014-12-07 21:50
      收起回复
        明天有电脑了,再把代码执行下


        来自Android客户端5楼2014-12-07 21:57
        收起回复
          = =这种东西具体的也说不清楚,因为如果给b加上static 又是一种结果,把两个sleep或者其中一个换成wait又是一种结果..你只需要记住sleep的时候会锁住对象,wait不会就OK了 。。你真想搞清楚只能自己不停的试


          IP属地:湖北6楼2014-12-07 22:01
          收起回复
            m2()先执行 锁住对象 m1()需等m2()执行之后再执行 m2()执行完的一瞬间 m1()把b设为1000,
            然后main现成打印出1000, 然后m1 打印出 b:1000


            IP属地:山东7楼2014-12-07 22:29
            收起回复
              不错的问题,我也不回答什麼,只是想提醒一句,希望有帮助:执行Thread.sleep(...)时锁是不会释放的(详见《Java编程思想》一书)。


              IP属地:广东8楼2014-12-07 23:17
              收起回复
                在Java核心技术还是编程思想还是面向对象书中,好吧,我忘了是那本书了,有空去翻翻吧,意思是thread.sleep方法只是睡眠而已,让给其他线程拿到cpu的机会,如果当前线程持有锁,锁仍然占有,如果希望释放锁的话用wait方法,线程这边很头疼,一起努力吧


                IP属地:北京来自Android客户端9楼2014-12-08 00:04
                收起回复
                  楼主为啥要把m2的输出注释掉?


                  IP属地:浙江来自iPhone客户端10楼2014-12-08 00:17
                  收起回复

                       --社会有其黑暗的一面,阳光总有照射不到的地方。


                    来自Android客户端11楼2014-12-08 00:18
                    回复
                      sleep以后是不解锁的,要用wait


                      IP属地:上海来自iPhone客户端12楼2014-12-08 07:26
                      回复


                        IP属地:河南来自Android客户端13楼2014-12-08 07:54
                        回复
                          应该是执行到有b的语句的时候等待先开的线程


                          IP属地:日本来自Android客户端14楼2014-12-08 08:38
                          收起回复
                            楼主,用得什么软件学的代码啊?


                            来自Android客户端15楼2014-12-08 09:42
                            收起回复