Thinker

            - long way to go...

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

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

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

          主站蜘蛛池模板: 镇雄县| 华池县| 大名县| 河源市| 汝州市| 瑞金市| 简阳市| 南木林县| 时尚| 奉化市| 康平县| 内丘县| 永清县| 凭祥市| 太康县| 开远市| 雅江县| 东兰县| 萨嘎县| 清丰县| 含山县| 秦皇岛市| 青海省| 左权县| 大足县| 哈尔滨市| 枣强县| 金塔县| 津市市| 安庆市| 西青区| 乐陵市| 龙胜| 乌拉特后旗| 宜兰市| 阿尔山市| 永兴县| 湄潭县| 仁寿县| 桑日县| 甘肃省|