xylz,imxylz

          關(guān)注后端架構(gòu)、中間件、分布式和并發(fā)編程

             :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            111 隨筆 :: 10 文章 :: 2680 評(píng)論 :: 0 Trackbacks

          我在CentOS release 5.3 (Final)遇到一種情況:

          一個(gè)類的所有public static final字段中,按照定義的從上往下順序,到一個(gè)字段為止,此字段的上面的所有字段都能訪問,此字段下面(包括子字段)都不能訪問。

          具體是這樣的:resin環(huán)境下一個(gè)jsp訪問一個(gè)類的某個(gè)字段,在web請(qǐng)求此jsp的時(shí)候被告知編譯jsp失敗,原因是:cannot find symbol。并指明了此類的哪一個(gè)字段。具體分析后發(fā)現(xiàn)此字段的上面所有字段都可以訪問,此字段的下面字段(包括自己)都不能訪問。但是詭異的是,在jsp中使用Class.getField()或者getFields()遍歷是可以拿到此字段的,并且此字段是完整的,可用的。

          也就是說JVM實(shí)例化了一個(gè)類,完成了所有字段的初始化,但是在將所有字段設(shè)置為對(duì)外可見時(shí)失敗了,導(dǎo)致一部分字段對(duì)外是不可見的,但是此類卻成功初始化,并對(duì)外可用了。這里所說的對(duì)外可見不是說字段設(shè)置為非public,而是類外根本就看不到,因?yàn)槿绻欠莗ublic的話會(huì)得到一個(gè)訪問修飾符不可見的錯(cuò)誤,但是現(xiàn)在得到是不存在此符號(hào)。這只是我的猜想,并不一定正確。

          我的JVM版本如下:

          java version "1.6.0_10"
          Java(TM) SE Runtime Environment (build 1.6.0_10-b33)
          Java HotSpot(TM) 64-Bit Server VM (build 11.0-b15, mixed mode)

          其中resin比較老,是3.0.21 pro版本。特別說明的是,這種情況是偶爾才出現(xiàn),重啟resin就消失了,所有字段可以正常訪問。我一共遇到了兩次,目前仍然不知道是JVM的bug還是resin的bug。

           

          第二個(gè)詭異的事情是,聽同事(兩個(gè)以上人看過現(xiàn)象)描述他寫了一個(gè)單例,如下:

          public class Singleton {

              private static final Singleton instance = new Singleton();

              private Singleton() {
              }

              public static Singleton getInstance() {
                  return instance;
              }
          }

          然后去調(diào)用getInstance(),結(jié)果居然得到一個(gè)null。特別說明的是 沒有ClassNotFoundException異常,沒有java.lang.ExceptionInInitializerError異常,也沒有java.lang.NoClassDefFoundError異常,沒有任何異常,是一個(gè)真真正正的null。

          當(dāng)然了,比較詭異的是重啟JVM就沒有此現(xiàn)象了。此現(xiàn)象我沒有重現(xiàn)過,也沒有看到過,只是道途聽說,不好過多評(píng)論。

           

          以上兩個(gè)問題有誰遇到過么?

          難道是RP問題?靈異事件?JVM BUG?



          ©2009-2014 IMXYLZ |求賢若渴
          posted on 2010-08-12 00:54 imxylz 閱讀(3137) 評(píng)論(14)  編輯  收藏 所屬分類: J2EE

          評(píng)論

          # re: 這是JVM的Bug么?誰遇到下面的情況? 2010-08-12 07:41 Robin's Java World
          按你說的,確實(shí)夠靈異的。  回復(fù)  更多評(píng)論
            

          # re: 這是JVM的Bug么?誰遇到下面的情況? 2010-08-12 08:31 蒲田
            public static Singleton getInstance() {
              if (instance == null)
                instance = new Singleton();
              return instance;
            }

          這是我在老一輩手上學(xué)到的教訓(xùn),說這是良好習(xí)慣  回復(fù)  更多評(píng)論
            

          # re: 這是JVM的Bug么?誰遇到下面的情況? 2010-08-12 08:53 liping
          這算哪門子良好習(xí)慣  回復(fù)  更多評(píng)論
            

          # re: 這是JVM的Bug么?誰遇到下面的情況? 2010-08-12 09:38 xylz
          @蒲田
          一看就是新手  回復(fù)  更多評(píng)論
            

          # re: 這是JVM的Bug么?誰遇到下面的情況? 2010-08-12 09:53 xylz
          @xylz
          參考《單例模式完全解析》
          http://www.aygfsteel.com/xylz/archive/2009/12/18/306622.html  回復(fù)  更多評(píng)論
            

          # re: 這是JVM的Bug么?誰遇到下面的情況? 2010-08-12 10:31 bingo
          同意。static 字段會(huì)在構(gòu)造器之前執(zhí)行。   回復(fù)  更多評(píng)論
            

          # re: 這是JVM的Bug么?誰遇到下面的情況? 2010-08-12 10:32 bingo
          @liping
          確實(shí)很好,用到時(shí)候在加載。除非你要求更快訪問且內(nèi)存夠大  回復(fù)  更多評(píng)論
            

          # re: 這是JVM的Bug么?誰遇到下面的情況? 2010-08-12 14:43 蒲田
          抱歉是我沒看清楚 這問題  回復(fù)  更多評(píng)論
            

          # re: 這是JVM的Bug么?誰遇到下面的情況? 2010-08-12 14:57 蒲田
          我原以為是Debug 所以提出"如此見解",自己也曾遇過這問題,就理論來說是不需要多我那個(gè)檢查,但是當(dāng)時(shí)詢問長(zhǎng)輩的,卻被責(zé)備:"就塞進(jìn)去一個(gè)檢查",所以就不曾思考這問題了  回復(fù)  更多評(píng)論
            

          # re: 這是JVM的Bug么?誰遇到下面的情況? 2010-08-12 15:10 shaiehv
          曙海嵌入式學(xué)院提供以下課程的培訓(xùn)--中國(guó)最大的FPGA,DSP和3G手機(jī)通信培訓(xùn)機(jī)構(gòu):
          FPGA培訓(xùn),DSP培訓(xùn),MTK培訓(xùn),Android培訓(xùn),Symbian培訓(xùn),iPhone培訓(xùn),單片機(jī)培訓(xùn),Candence PCB培訓(xùn),Vxworks培訓(xùn)等。
          網(wǎng)址: http://www.51qianru.cn
          上海總部電話:021-51875830 深圳:0755-61280252 北京:010-51292078 南京:025-68662821  回復(fù)  更多評(píng)論
            

          # re: 這是JVM的Bug么?誰遇到下面的情況? 2010-08-15 19:38 ouyang
          第2個(gè)問題,是否存在多線程并發(fā)訪問的情況?
          如果存在多線程,是有可能取得null,不是jvm的問題。
          一個(gè)線程在初始化class后,調(diào)用new Singleton(); 時(shí)被掛起;這個(gè)時(shí)候另個(gè)線程訪問 getInstance(),但是這個(gè)時(shí)候instance 是存在的,jvm給這個(gè)做了初始化,但是還沒有分配好對(duì)象值。所以instance就是null了。  回復(fù)  更多評(píng)論
            

          # re: 這是JVM的Bug么?誰遇到下面的情況? 2010-08-15 20:50 xylz
          @ouyang
          JAVA規(guī)范保證一個(gè)類的static字段和static塊運(yùn)行結(jié)束后才能被調(diào)用。  回復(fù)  更多評(píng)論
            

          # re: 這是JVM的Bug么?誰遇到下面的情況? 2010-08-18 21:29 ouyang
          @xylz
          是的,多線程情況下也不應(yīng)該出現(xiàn)這樣的問題。  回復(fù)  更多評(píng)論
            

          # re: 這是JVM的Bug么?誰遇到下面的情況? 2010-09-02 10:20 bonamana
          加一個(gè) volatile 就好了吧

          java內(nèi)存模型的一個(gè)“bug“或者什么,指令重排,返回了對(duì)象,但是對(duì)象尚未初始化。

          多線程出現(xiàn)的  回復(fù)  更多評(píng)論
            


          ©2009-2014 IMXYLZ
          主站蜘蛛池模板: 阜宁县| 北海市| 乐清市| 临清市| 安丘市| 八宿县| 康平县| 平江县| 若羌县| 岳普湖县| 海伦市| 衡阳县| 台州市| 将乐县| 洛宁县| 五莲县| 马鞍山市| 金乡县| 大丰市| 历史| 吉木乃县| 黔江区| 东乌珠穆沁旗| 安陆市| 屏东市| 汕尾市| 龙南县| 新宾| 南昌市| 石阡县| 永年县| 大田县| 阳江市| 凯里市| 特克斯县| 荔浦县| 梓潼县| 会宁县| 英超| 新竹市| 轮台县|