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 閱讀(3767) 評論(2)  編輯  收藏 所屬分類: Java

          評論

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

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

          主站蜘蛛池模板: 水富县| 南皮县| 长子县| 政和县| 龙泉市| 周至县| 嘉祥县| 香港 | 阳山县| 南部县| 南皮县| 五大连池市| 石台县| 云林县| 五河县| 明光市| 黎川县| 惠安县| 哈尔滨市| 淮安市| 竹北市| 遵义县| 万载县| 内丘县| 华池县| 文昌市| 乐昌市| 南皮县| 永州市| 观塘区| 茌平县| 金平| 江西省| 馆陶县| 博爱县| 久治县| 寿宁县| 莱芜市| 涪陵区| 定襄县| 庆元县|