【问题标题】:Mutable static variable across multiple threads跨多个线程的可变静态变量
【发布时间】:2012-01-12 21:22:41
【问题描述】:

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

    public static String DEFAULT_CONNECTION_TYPE = "UDP";

假设我将在多个线程上创建大量 Connector 对象,但每个线程将使用不同的连接方法(如“TCP”)。在将使用其他连接类型的线程上,如果我不想为每个对象显式声明它,有没有办法在每个线程上更改 DEFAULT_CONNECTION_TYPE?是否有一个关键字可以使变量成为线程局部变量,但在该线程中仍然是静态的?这有意义吗?

【问题讨论】:

  • 请不要使用可变的静态变量,即使是线程全局变量!

标签: java multithreading static-members


【解决方案1】:

我不建议为了避免在类实例中携带它而从多个线程更改静态变量,但如果这是您想要做的,请参阅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。
【解决方案2】:
【解决方案3】:

查看ThreadLocal

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-04
    • 1970-01-01
    • 2012-11-24
    • 2012-01-14
    • 2010-10-10
    • 2013-08-31
    • 2012-01-15
    相关资源
    最近更新 更多