这是jvm的bug么?谁遇到下面的情况? -凯发k8网页登录

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

   :: 凯发k8网页登录首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  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 阅读(3054) 评论(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
这算哪门子良好习惯  回复  
  

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

# re: 这是jvm的bug么?谁遇到下面的情况? 2010-08-12 09:53 xylz
@xylz
参考《单例模式完全解析》
  回复  
  

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

# re: 这是jvm的bug么?谁遇到下面的情况? 2010-08-12 10:32
@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
曙海嵌入式学院提供以下课程的培训--中国最大的fpga,dsp和3g手机通信培训机构:
fpga培训,dsp培训,mtk培训,android培训,symbian培训,iphone培训,单片机培训,candence pcb培训,vxworks培训等。
网址:
上海总部电话:021-51875830 深圳:0755-61280252 北京:010-51292078 南京:025-68662821  回复  
  

# re: 这是jvm的bug么?谁遇到下面的情况? 2010-08-15 19:38
第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
@xylz
是的,多线程情况下也不应该出现这样的问题。  回复  
  

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

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

多线程出现的  回复  
  


©2009-2014
网站地图