2012-02-29 62 views
1

如果非要在實現Runnable的類的log4j的記錄:同一類的線程之間共享一個Logger

MyTask implements Runnable { 
    private static final Logger log = Logger.getLogger(MyTask.class); 
    ... 
} 

如果我創建這個Runnable的多個實例,並將其提交給ExecutorService上多核心機器並行運行,並且它們都寫入靜態Logger,這似乎是存在爭用的風險。一個更好的模式似乎是:

MyTask implements Runnable { 
    private final Logger log; 
    MyTask(String name) { 
    log = Logger.getLogger(name); 
    } 
    ... 
} 

所以我的問題...這是你已經使用或找到所需的圖案,此刻我是純粹hypothesising?

謝謝

+0

你想解決什麼問題?忽略過早的優化問題,除非這些記錄器都具有不同的基礎目標,否則輸出可能會在某個級別同步(如果不是,則交織輸出不可用)。 – 2012-02-29 19:31:31

回答

5

在很多線程中共享一個靜態類記錄器是非常典型的。通常情況下,記錄器具有已經同步的底層PrintStream,因此創建多個Logger是不必要和浪費的。