静态块是按顺序执行的吗?如果它不是一个块也是怎么回事

时间:2017-12-31 07:02:42

标签: java multithreading concurrency static safe-publication

这些带静态初始化器的行是否保证按顺序运行?因为如果不是那么事情可能会出错

public Class x {
    private static final BasicDataSource ds = new BasicDataSource();
    private static final JdbcTemplate jdbcTemplate = new JdbcTemplate(ds);
    private static final SomeDao someDao = new SomeDao(jdbcTemplate);
}

好的......这个怎么样?

public Class x {
    private static final BasicDataSource ds;
    private static final JdbcTemplate jdbcTemplate;
    private static final SomeDao someDao;

    static {
        ds = new BasicDataSource();
        ds.setStuff("foo");
        ds.setAnotherProperty("bar");
        jdbcTemplate = new JdbcTemplate(ds);
        SomeDao someDao = new SomeDao(jdbcTemplate);
    }
}

1 个答案:

答案 0 :(得分:1)

它们将按照与源代码中列出的顺序相对应的顺序执行。

  

一个类可以有任意数量的静态初始化块,它们可以出现在类体中的任何位置。运行时系统保证按照它们在源代码中出现的顺序调用静态初始化块。 Initializing Fields

使用以下代码可以观察到这一点:

private static A a1 = new A(0);
private static A a2 = new A(1);
private static A a3 = new A(2);
private static A a4 = new A(3);
private static A a5 = new A(4);
private static A a6 = new A(5);

public static void main (String args[]) {  }

static class A {
    public A (int a) {
        System.out.print(a);
    }
}

输出总是 012345