Dev@Free

          zJun's Tech Weblog

          Java 多線程中的死鎖問題

          Java中的多線程使用 synchronized關(guān)鍵字實(shí)現(xiàn)同步.為了避免線程中使用共享資源的沖突,當(dāng)線程進(jìn)入 synchronized的共享對(duì)象時(shí),將為共享對(duì)象加上鎖,阻止其他的線程進(jìn)入該共享對(duì)象.但是,正因?yàn)檫@樣,當(dāng)多線程訪問多個(gè)共享對(duì)象時(shí),如果線程鎖定對(duì)象的順序處理不當(dāng)話就有可能線程間相互等待的情況,即常說的: 死鎖現(xiàn)象.

          比如下面演示了一個(gè)典型的死鎖的情況:

          線程:MyThread
          /**
          ?*?共享線程
          ?*
          */

          Class?MyThread?
          extends ?Thread {
          ??
          private
          ?String?threadName;
          ??
          private
          ?String?shareObj1,shareObj2;
          ??
          public ?MyThread(String?name,String?shareObj1,String?shareObj2)
          {
          ????
          this .threadName? =
          ?name;
          ????
          this .shareObj1? =
          ?shareObj1;
          ????
          this .shareObj2? =
          ?shareObj2;
          ????start();
          ??}

          ??
          public ?run() {
          ????
          synchronized (shareObj1)
          {
          ??????System.out.println(threadName?
          + ? " locked?for?shareObj1 "
          );
          ????}

          ????Thread.sleep(
          1000 );
          ????
          synchronized (shareObj1)
          {
          ??????System.out.println(threadName?
          + ? " locked?for?shareObj2 "
          );
          ????}


          ??}

          }

          主程序:Main
          public ? class ?Main {
          ??
          private ?String?shareObj1? = ? " share?object?1 "
          ;
          ??
          private ?String?shareObj2? = ? " share?object?2 "
          ;
          ??
          public ? static ?main(String[]?args)
          {
          ????MyThread?thread1?
          = ? new ?MyThread( " thread1 "
          ,shareObj1,shareObj2);
          ????Thread.sleep(
          1000
          );
          ????MyThread?thread2?
          = ? new ?MyThread( " thread2 "
          ,shareObj1,shareObj2);
          ??}

          }

          運(yùn)行結(jié)果:

          posted on 2007-07-24 19:02 zJun's帛羅閣 閱讀(3235) 評(píng)論(1)  編輯  收藏 所屬分類: Java基礎(chǔ)

          評(píng)論

          # re: Java 多線程中的死鎖問題 2011-06-27 17:00 vistor

          synchronized (shareObj1) {
          System.out.println(threadName + " locked for shareObj1 " );
          }
          Thread.sleep( 1000 );
          synchronized (shareObj1) {
          System.out.println(threadName + " locked for shareObj2 " );
          }
          代碼錯(cuò)了吧!這會(huì)死鎖嗎?
          第二個(gè)是2并且new 2時(shí)順序顛倒  回復(fù)  更多評(píng)論   

          導(dǎo)航

          <2007年7月>
          24252627282930
          1234567
          891011121314
          15161718192021
          22232425262728
          2930311234

          統(tǒng)計(jì)

          常用鏈接

          留言簿(15)

          隨筆分類

          隨筆檔案

          相冊(cè)

          收藏夾

          博客

          文檔

          站點(diǎn)

          論壇

          搜索

          積分與排名

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 无为县| 讷河市| 深圳市| 南京市| 马龙县| 富源县| 信宜市| 东乡族自治县| 鹿泉市| 连平县| 阳新县| 西城区| 蕲春县| 青神县| 瑞丽市| 铜鼓县| 大悟县| 柘城县| 区。| 措美县| 丰宁| 新宾| 香格里拉县| 阿克苏市| 澳门| 井研县| 安仁县| 衡山县| 丹江口市| 泗阳县| 平陆县| 福海县| 清丰县| 怀宁县| 深州市| 方城县| 九龙县| 桑植县| 龙陵县| 河北省| 衡东县|