【问题标题】:Does a static code-block runs more than one time in concurrent environment [duplicate]静态代码块是否在并发环境中运行多次[重复]
【发布时间】:2020-06-10 08:19:50
【问题描述】:

我有一个静态代码块:

public class MyClass {

static {
        
        String s = "src/test/resources/dfdf.properties";
        Resource r = new FileSystemResource(s);
        
        Properties props = new Properties();
        
        try {
            props.load(r.getInputStream());
            
            accessToken = props.getProperty("password");
            locationToken = props.getProperty("username");
            
        } catch (IOException e) {
            LOG.error("We have an error for reading the access and location tokens for Brink web-service config");
        }
    }


}

如果我理解正确的话,即使我们有并发环境,静态代码块也只会运行一次。对吗?

【问题讨论】:

  • 仅在类加载到内存时执行。这并不意味着每次实例化或调用它
  • @Stultuske “这并不意味着每次你实例化或调用它” - 所以如果我需要再次实例化该类,它不会再次调用这个块?
  • 即使您根本没有实例化该类的任何实例,它也会运行。我认为在一个简单的标准 java 应用程序中,您可以说它会在应用程序启动时运行一次。在其他在运行时动态加载新类的环境中,它可能会更复杂一些。但它始终是线程安全的。
  • @Amongalen 这正是我需要知道的。所以该块将是线程安全的并且只运行一次。
  • 是的,但必须加载 MyClass。

标签: java multithreading concurrency


【解决方案1】:

是的,该代码是在类加载器加载类时第一次执行的,并且您知道类加载后所有方法信息和相关信息都将存储在JVM的方法区域中,并且该信息将由程序中的所有线程共享。所以其他线程只访问该区域的方法定义、字段、常量池信息,不再执行这样的静态块。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-30
    • 2021-11-25
    • 1970-01-01
    • 1970-01-01
    • 2016-02-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多