xylz,imxylz

关注后端架构、中间件、分布式和并发编程

   :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  111 随笔 :: 10 文章 :: 2680 评论 :: 0 Trackbacks

我在CentOS release 5.3 (Final)遇到一种情况:

一个类的所有public static final字段中,按照定义的从上往下顺序,到一个字段为止,此字段的上面的所有字段都能访问,此字段下面(包括子字段)都不能访问。

具体是这样的:resin环境下一个jsp访问一个类的某个字段,在web请求此jsp的时候被告知编译jsp失败,原因是:cannot find symbol。并指明了此类的哪一个字段。具体分析后发现此字段的上面所有字段都可以访问,此字段的下面字段(包括自己)都不能访问。但是诡异的是,在jsp中使用Class.getField()或者getFields()遍历是可以拿到此字段的,并且此字段是完整的,可用的。

也就是说JVM实例化了一个类,完成了所有字段的初始化,但是在将所有字段设置为对外可见时失败了,导致一部分字段对外是不可见的,但是此类却成功初始化,并对外可用了。这里所说的对外可见不是说字段设置为非public,而是类外根本就看不到,因为如果是非public的话会得到一个访问修饰符不可见的错误,但是现在得到是不存在此符号。这只是我的猜想,并不一定正确。

我的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版本。特别说明的是,这种情况是偶尔才出现,重启resin就消失了,所有字段可以正常访问。我一共遇到了两次,目前仍然不知道是JVM的bug还是resin的bug。

 

第二个诡异的事情是,听同事(两个以上人看过现象)描述他写了一个单例,如下:

public class Singleton {

    private static final Singleton instance = new Singleton();

    private Singleton() {
    }

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

然后去调用getInstance(),结果居然得到一个null。特别说明的是 没有ClassNotFoundException异常,没有java.lang.ExceptionInInitializerError异常,也没有java.lang.NoClassDefFoundError异常,没有任何异常,是一个真真正正的null。

当然了,比较诡异的是重启JVM就没有此现象了。此现象我没有重现过,也没有看到过,只是道途听说,不好过多评论。

 

以上两个问题有谁遇到过么?

难道是RP问题?灵异事件?JVM BUG?



©2009-2014 IMXYLZ |求贤若渴
posted on 2010-08-12 00:54 imxylz 阅读(3113) 评论(14)  编辑  收藏 所属分类: J2EE

评论

# re: 这是JVM的Bug么?谁遇到下面的情况? 2010-08-12 07:41 Robin's Java World
按你说的,确实够灵异的。  回复  更多评论
  

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

這是我在老一輩手上學到的教訓,說這是良好習慣  回复  更多评论
  

# re: 这是JVM的Bug么?谁遇到下面的情况? 2010-08-12 08:53 liping
这算哪门子良好习惯  回复  更多评论
  

# re: 这是JVM的Bug么?谁遇到下面的情况? 2010-08-12 09:38 xylz
@蒲田
一看就是新手  回复  更多评论
  

# re: 这是JVM的Bug么?谁遇到下面的情况? 2010-08-12 09:53 xylz
@xylz
参考《单例模式完全解析》
http://www.blogjava.net/xylz/archive/2009/12/18/306622.html  回复  更多评论
  

# re: 这是JVM的Bug么?谁遇到下面的情况? 2010-08-12 10:31 bingo
同意。static 字段会在构造器之前执行。   回复  更多评论
  

# re: 这是JVM的Bug么?谁遇到下面的情况? 2010-08-12 10:32 bingo
@liping
确实很好,用到时候在加载。除非你要求更快访问且内存够大  回复  更多评论
  

# re: 这是JVM的Bug么?谁遇到下面的情况? 2010-08-12 14:43 蒲田
抱歉是我沒看清楚 這問題  回复  更多评论
  

# re: 这是JVM的Bug么?谁遇到下面的情况? 2010-08-12 14:57 蒲田
我原以為是Debug 所以提出"如此見解",自己也曾遇過這問題,就理論來說是不需要多我那個檢查,但是當時詢問長輩的,卻被責備:"就塞進去一個檢查",所以就不曾思考這問題了  回复  更多评论
  

# re: 这是JVM的Bug么?谁遇到下面的情况? 2010-08-12 15:10 shaiehv
曙海嵌入式学院提供以下课程的培训--中国最大的FPGA,DSP和3G手机通信培训机构:
FPGA培训,DSP培训,MTK培训,Android培训,Symbian培训,iPhone培训,单片机培训,Candence PCB培训,Vxworks培训等。
网址: http://www.51qianru.cn
上海总部电话:021-51875830 深圳:0755-61280252 北京:010-51292078 南京:025-68662821  回复  更多评论
  

# re: 这是JVM的Bug么?谁遇到下面的情况? 2010-08-15 19:38 ouyang
第2个问题,是否存在多线程并发访问的情况?
如果存在多线程,是有可能取得null,不是jvm的问题。
一个线程在初始化class后,调用new Singleton(); 时被挂起;这个时候另个线程访问 getInstance(),但是这个时候instance 是存在的,jvm给这个做了初始化,但是还没有分配好对象值。所以instance就是null了。  回复  更多评论
  

# re: 这是JVM的Bug么?谁遇到下面的情况? 2010-08-15 20:50 xylz
@ouyang
JAVA规范保证一个类的static字段和static块运行结束后才能被调用。  回复  更多评论
  

# re: 这是JVM的Bug么?谁遇到下面的情况? 2010-08-18 21:29 ouyang
@xylz
是的,多线程情况下也不应该出现这样的问题。  回复  更多评论
  

# re: 这是JVM的Bug么?谁遇到下面的情况? 2010-09-02 10:20 bonamana
加一个 volatile 就好了吧

java内存模型的一个“bug“或者什么,指令重排,返回了对象,但是对象尚未初始化。

多线程出现的  回复  更多评论
  


只有注册用户登录后才能发表评论。


网站导航:
 

©2009-2014 IMXYLZ