Java 静态初始值设定项线程安全吗? [英] Are Java static initializers thread safe?

查看:45
本文介绍了Java 静态初始值设定项线程安全吗?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用静态代码块来初始化我拥有的注册表中的一些控制器.因此,我的问题是,我能否保证在第一次加载类时,这个静态代码块只会被绝对调用一次?我知道我不能保证什么时候会调用这个代码块,我猜它是在类加载器第一次加载它的时候.我意识到我可以在静态代码块中的类上进行同步,但我猜这实际上是发生了什么?

I'm using a static code block to initialize some controllers in a registry I have. My question is therefore, can I guarantee that this static code block will only absolutely be called once when the class is first loaded? I understand I cannot guarantee when this code block will be called, I'm guessing its when the Classloader first loads it. I realize I could synchronize on the class in the static code block, but my guess is this is actually what happens anyway?

简单的代码示例是;

class FooRegistry {

    static {
        //this code must only ever be called once 
        addController(new FooControllerImpl());
    }

    private static void addController(IFooController controller) { 
        // ...
    }
}

或者我应该这样做;

class FooRegistry {

    static {
        synchronized(FooRegistry.class) {
            addController(new FooControllerImpl());
        }
    }

    private static void addController(IFooController controller) {
        // ...
    }
}

推荐答案

是的,Java 静态初始值设定项是线程安全的(使用您的第一个选项).

Yes, Java static initializers are thread safe (use your first option).

但是,如果您想确保代码恰好执行一次,则需要确保该类仅由单个类加载器加载.每个类加载器执行一次静态初始化.

However, if you want to ensure that the code is executed exactly once you need to make sure that the class is only loaded by a single class-loader. Static initialization is performed once per class-loader.

这篇关于Java 静态初始值设定项线程安全吗?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆