Java 静态方法与线程安全

Java 静态方法与线程安全,java,Java,以下代码是线程安全的吗 public static Entity getInstance(){ //the constructor below is a default one. return new Entity(); } 假设构造函数本身是线程安全的,这很好 构造函数不是线程安全的,这是非常不寻常的,但是可能。。。即使它为实体调用默认的自动生成构造函数,基本构造函数也可能不是线程安全的。我不是说有可能,只是可能:) 基本上,静态方法、实例方法或构造函数都没有神奇的

以下代码是线程安全的吗

    public static Entity getInstance(){
//the constructor below is a default one.
     return new Entity();
    }

假设构造函数本身是线程安全的,这很好

构造函数不是线程安全的,这是非常不寻常的,但是可能。。。即使它为
实体
调用默认的自动生成构造函数,基本构造函数也可能不是线程安全的。我不是说有可能,只是可能:)

基本上,静态方法、实例方法或构造函数都没有神奇的线程安全性。除非应用了同步,否则它们都可以在多个线程上并发调用。如果他们不获取或更改任何共享数据,他们通常是安全的-如果他们访问共享数据,您需要更加小心。(如果共享数据是不可变的或仅可读取的,这通常是可以的——但如果其中一个线程将对其进行变异,则需要非常小心。)


只有静态初始值设定项(静态变量的初始化表达式和类内的静态{…}块)有特殊处理-VM确保它们执行一次且仅执行一次,阻止正在等待初始化类型的其他线程。

这取决于实体构造函数的详细信息。如果实体构造函数修改共享数据,则不会修改。

多个线程可以调用此方法,每个线程将获得一个唯一的“实体”实例。所以这个方法本身是线程安全的。但是,如果构造函数或某个超级构造函数中的代码不是线程安全的,那么无论如何都可能存在安全问题。

线程安全是指访问不同线程之间的共享数据。示例中的代码本身不访问共享数据,但它是否线程安全取决于构造函数是否访问可以在不同线程之间共享的数据


关于并发编程,有许多微妙而困难的问题需要处理。如果您想了解Java中的线程安全和并发编程,那么我强烈推荐Brian Goetz的书。

它可能是线程安全的,但重点是什么?如果您只是使用工厂方法重定向到默认构造函数,那么为什么不首先使用构造函数呢?所以问题是:你想要实现什么?名称
getInstance()
表示一个单例(至少这是常见的做法),但显然这里没有单例。如果您确实想要单例,请使用如下静态内部holder类:

    public class Singleton {

        private Singleton() {
        }

        public static Singleton getInstance() {
            return InstanceHolder.INSTANCE;
        }

        private static final class InstanceHolder {

            public static final Singleton INSTANCE = new Singleton();

        }
    }

但是如果您不这样做,为什么还要麻烦使用这样一个工厂方法,因为您没有通过它添加任何值(方法名称语义、对象池、同步等)

您可以定义,共享数据是什么意思?据我所知,这将是
Enity
类的一些静态字段@Akshat:我指的是由多个线程访问和修改的任何数据。好吧,假设在本例中,如果构造函数初始化了一些最终的非原语字段,那么
getInstance()
方法是否需要同步以确保线程安全?@Akshat:不,在这种情况下可以。事实上,如果存在可变数据,就存在问题。将更新答案。