走自己的路

          路漫漫其修遠兮,吾將上下而求索

            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 叱咤紅人 閱讀(1257) 評論(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
          好文章!頂!  回復  更多評論
            

          主站蜘蛛池模板: 麻阳| 县级市| 梓潼县| 肃宁县| 遵化市| 湄潭县| 壶关县| 衡南县| 英德市| 崇州市| 南岸区| 新丰县| 宁明县| 团风县| 夏邑县| 肇州县| 通州区| 新营市| 师宗县| 乐山市| 太湖县| 安达市| 民乐县| 阳江市| 阿鲁科尔沁旗| 龙川县| 临猗县| 襄垣县| 达拉特旗| 潞城市| 晋州市| 县级市| 灵武市| 枣阳市| 读书| 安泽县| 四川省| 迭部县| 南郑县| 双辽市| 塔河县|