2012-01-12 89 views
0

我現在正在學習Java中的線程以及所有概念和關鍵字。我剛剛瞭解到volatile這個關鍵字,並且在我的工作中提出了一些有趣的問題。說我有一個域名爲Connector這樣的類:跨多個線程的可變靜態變量

public static String DEFAULT_CONNECTION_TYPE = "UDP"; 

說我會打很多的多線程Connector對象,但是每個線程將使用不同的連接方法(如「TCP」)。在將使用其他連接類型的線程上,如果我不想爲每個對象顯式聲明它,是否有辦法在每個線程上更改DEFAULT_CONNECTION_TYPE?有沒有一個關鍵字可以創建一個可變的線程本地的,但在該線程中仍然是靜態的?這甚至有意義嗎?

+2

請不要使用可變靜,甚至線程全局! – 2012-01-12 23:10:27

回答

6

我不建議從多個線程改變一個靜態變量,只是爲了避免在類的實例揹着它,但如果這是你想做的事,見ThreadLocal

做到這一點,正確的方法是使連接類型的實例字段:

enum ConnectionType { UDP, TCP; } 

class Connector { 

    private static final ConnectionType DEFAULT_CONNECTION_TYPE = 
     ConnectionType.UDP; 

    private final ConnectionType connectionType; 

    public Connector(ConnectionType connectionType) { 
     this.connectionType = connectionType; 
    } 

    public Connector() { 
     this(DEFAULT_CONNECTION_TYPE); 
    } 
} 
+0

這個例子很好。沒有理由在這裏使用ThreadLocal。 – jbindel 2012-01-13 00:58:28