首页 > 解决方案 > 拥有可变类的静态实例是否安全?

问题描述

我查看了FacesMessage. 它有设置器,所以我认为它不是线程安全的,比如SimpleDateFormat.

将它作为类中的静态变量是否安全?

标签: java

解决方案


它不是线程安全的,尽管这与它是类的静态成员无关;非静态成员也可以在多个线程之间共享。

public class Example implements Runnable {

    public static void main(String[] args) {
        Example sharedInstance = new Example();
        for(int i = 0; i < 5; i++) {
            new Thread(sharedInstance, "Worker " + (i + 1)).start();
        }
    }

    public void run() {
        for(int i = 0; i < 42; i++) {
            System.out.println(count++);
        }
    }

    private int count;

}

在这个例子中,声明private static int count不会改变程序的语义,尽管由于 JVM 优化仍然可能产生不同的结果。

因此,最终,您必须确定在任何给定时间有多少线程可以访问实例FacesMessage以及每个线程可能对其执行的操作。如果这些星座中的任何一个涉及修改,您将不得不添加某种形式的同步。


推荐阅读