Thinker

            - long way to go...

            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
            24 隨筆 :: 0 文章 :: 143 評論 :: 0 Trackbacks
           使用字符串常量作為鎖去同步代碼是非常危險的事情。請看下面的一段代碼:
            class Foo  {
          static private final String LOCK = "LOCK";
          void someMethod() {
          synchronized(LOCK) {
          ...
          }
          }
          }

          為什么這樣會有危險呢?私有的字符串常量是真正的私有嗎?答案是否定的。
            重新閱讀一下
          Java語言規范2.0的第3.10.5節,“不同包不同類中的值相同的字符串常量引用的是同一個字符串對象。”
            上面的那段代碼意味著外部任何的
          Class都可以包含指向同一個字符串對象的字符串常量,因此就有可能出現死鎖的情況!如果你的字符串對象調用了intern()方法也有可能會出現這種情況!
            這種情況在
          Jetty類庫中真正的出現過,兩個部分使用了相同的字符串常量去同步臨界區代碼,那兩個代碼片段產生了死鎖現象,并且出現了莫名其妙的棧的跟蹤信息。(Jetty-Bug已經記錄了這個BugJetty-352
            如果你確實需要一個對象鎖的話,最好使用
          new Object()來創建。也可以考慮使用java.util.concurrent包中的工具。

          英文原文:http://www.javalobby.org/java/forums/t96352.html


          http://www.aygfsteel.com/qujinlong123/




          posted on 2007-05-31 17:27 Long 閱讀(3761) 評論(2)  編輯  收藏 所屬分類: Java

          評論

          # re: 不要使用字符串常量作為對象鎖去同步代碼(翻) 2007-06-01 10:51 tomato
          好  回復  更多評論
            

          # re: 不要使用字符串常量作為對象鎖去同步代碼(翻) 2007-06-01 17:11 老李
          提醒的好,這種細節東西大家最容易忽略!
          頂  回復  更多評論
            

          主站蜘蛛池模板: 大理市| 岳普湖县| 抚松县| 博爱县| 南宁市| 黄龙县| 竹山县| 佳木斯市| 咸阳市| 满洲里市| 盐亭县| 土默特右旗| 龙陵县| 石楼县| 宜春市| 合川市| 丹寨县| 成都市| 拉萨市| 凤冈县| 石阡县| 新宁县| 全州县| 新兴县| 洛宁县| 凤阳县| 辽源市| 合作市| 玉门市| 普格县| 岑溪市| 武川县| 南江县| 开鲁县| 麟游县| 望奎县| 临沂市| 吴堡县| 专栏| 安丘市| 象州县|