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已經記錄了這個Bug,Jetty-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 老李
          提醒的好,這種細節東西大家最容易忽略!
          頂  回復  更多評論
            

          主站蜘蛛池模板: 广安市| 乡宁县| 建宁县| 武功县| 华安县| 轮台县| 新密市| 嘉义县| 内江市| 柳河县| 新泰市| 南木林县| 德惠市| 太湖县| 沾化县| 盐亭县| 青龙| 麦盖提县| 密云县| 报价| 麻江县| 罗城| 长武县| 吴川市| 农安县| 怀安县| 高碑店市| 巴塘县| 武强县| 凯里市| 南昌市| 民丰县| 武隆县| 汝州市| 阿拉尔市| 于都县| 双柏县| 花莲市| 滦南县| 常熟市| 遂川县|