走自己的路

路漫漫其修远兮,吾将上下而求索

  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  50 随笔 :: 4 文章 :: 118 评论 :: 0 Trackbacks
 
  1. 作为static变量,static属性是不会被序列化的,但是log object被定义成static,如果该类是shared library,常常会出现问题。因为shared libraryclassloader可能是每个application classloader的祖辈,所以这些类只会被load一次,也就是说所有application就会共享这个log object,所有的log信息都会输出到相同的地方.
public class Foo {
  
private final static Log log = LogFactory.getLog(Foo.class);
  .etc
}

 

  1. 作为类的实例变量:log对象一般情况下是不需要序列化的,所以我们需要用transient来声明。

方法1

    
  private transient Log log;
  
private Log getLog() {
    
if (log == null)
      log
=LogFactory.getLog(Some.class);
    
return log;
  }

  getLog().debug(
"foo");

 

方法2

private transient Log log = LogFactory.getLog(Some.class);
  
private Object readResolve() {
     log 
= LogFactory.getLog(Some.class);
     
return this;
  }

 

这个比起静态变量,每个实例都需要创建一个引用,都要分配4或者8个字节的空间,需要消耗更多的cpu和内存,但是保险。




posted on 2008-07-04 11:38 叱咤红人 阅读(1237) 评论(2)  编辑  收藏 所属分类: J2SE and JVM Other Java and J2EE frameworks

评论

# re: 在可序列化的类中使用log对象 2008-07-04 17:06 Jack.Wang
以前在做 web 时就有过 shared library 的问题----类转型冲突(明明是这个类的对象怎么冲突呢?原因就是不同的 classloader 加载的class,对象属于不同的 class),最后是把 lib 放到 share lib 下,这样每个子 classloader 就可以共用 class.  回复  更多评论
  

# re: 在可序列化的类中使用log对象 2008-07-06 10:52 sqh
好文章!顶!  回复  更多评论
  


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


网站导航: