Java 跨多个线程的可变静态变量

Java 跨多个线程的可变静态变量,java,multithreading,static-members,Java,Multithreading,Static Members,我现在正在学习Java中的线程,以及所有的概念和关键字。我刚刚学习了volatile关键字,它在我的脑海中提出了一些关于我正在从事的项目的有趣问题。假设我有一个名为Connector的类,其字段如下: public static String DEFAULT_CONNECTION_TYPE = "UDP"; 假设我将在多个线程上创建许多连接器对象,但每个线程将使用不同的连接方法,如TCP。在将使用其他连接类型的线程上,如果我不想为每个对象显式声明它,是否有方法更改每个线程上的默认连接类

我现在正在学习Java中的线程,以及所有的概念和关键字。我刚刚学习了volatile关键字,它在我的脑海中提出了一些关于我正在从事的项目的有趣问题。假设我有一个名为Connector的类,其字段如下:

    public static String DEFAULT_CONNECTION_TYPE = "UDP";

假设我将在多个线程上创建许多连接器对象,但每个线程将使用不同的连接方法,如TCP。在将使用其他连接类型的线程上,如果我不想为每个对象显式声明它,是否有方法更改每个线程上的默认连接类型?是否有一个关键字可以使变量线程成为本地线程,但在该线程中仍然是静态的?这有意义吗?

签出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);
    }
}

请不要使用可变静态,甚至线程全局变量!这个例子很好。这里没有理由使用ThreadLocal。