0

我有一个静态的 final 属性存储 a DataSource,可以由多个线程访问。这DataSource是在 Tomcat 启动时设置的。

我应该同步访问这个DataSource吗?我担心的是,DataSource一个线程可能会更改内部状态,而另一个线程看不到。

我仍然不清楚是否可以在不同步的情况下访问“只读”静态字段,或者在任何情况下它是否是强制性的。

我在这个答案中读到,也许只有初始化属性的方法需要同步,所以我的代码就可以了:

public static final DataSource myDataSource;
static {
    InitialContext context = new InitialContext();
    myDataSource = (DataSource) context.lookup("jdbc/DataSource");
}

但是真的可以吗?在性能方面做到这一点的最佳方法是什么?

4

2 回答 2

3

如果按照您的方式对其进行初始化,则访问数据源引用是线程安全的。

请记住,数据源本身中方法的线程安全性是一个完全不同的问题。即使您正确地获取了对象引用,如果不同步并被许多线程访问,它的内部状态也可能变得无效。

顺便说一句:为什么不这样写:

public static final DataSource myDataSource = (DataSource) new InitialContext().lookup("jdbc/DataSource");
于 2013-03-05T14:30:07.820 回答
1

java.sql.DataSource 是一个接口,它的 API 没有说明任何关于安全性的内容,因此它取决于实现。例如 apache-dbcp BasicDataSource 是线程安全的,因为它的方法是同步的。

于 2013-03-05T14:33:42.917 回答