如果我在下面定义了一个 Java 类,它通过依赖注入(inject)注入(inject)到我的 Web 应用程序中:
public AccountDao
{
private NamedParameterJdbcTemplate njt;
private List<Account> accounts;
public AccountDao(Datasource ds)
{
this.njt = new NamedParameterJdbcTemplate(ds);
refreshAccounts();
}
/*called at creation, and then via API calls to inform service new users have
been added to the database by a separate program*/
public void refreshAccounts()
{
this.accounts = /*call to database to get list of accounts*/
}
//called by every request to web service
public boolean isActiveAccount(String accountId)
{
Account a = map.get(accountId);
return a == null ? false : a.isActive();
}
}
我担心线程安全。 Spring 框架是否不处理一个请求正在从列表中读取并且当前正在被另一个请求更新的情况?我以前在其他应用程序中使用过读/写锁,但我以前从未想过像上面这样的情况。
我计划将该 bean 用作单例,以便减少数据库负载。
顺便说一句,这是对以下问题的跟进:
Java Memory Storage to Reduce Database Load - Safe?
编辑:
这样的代码能解决这个问题吗:
/*called at creation, and then via API calls to inform service new users have
been added to the database by a separate program*/
public void refreshAccounts()
{
//java.util.concurrent.locks.Lock
final Lock w = lock.writeLock();
w.lock();
try{
this.accounts = /*call to database to get list of accounts*/
}
finally{
w.unlock();
}
}
//called by every request to web service
public boolean isActiveAccount(String accountId)
{
final Lock r = lock.readLock();
r.lock();
try{
Account a = map.get(accountId);
}
finally{
r.unlock();
}
return a == null ? false : a.isActive();
}
最佳答案
Spring 框架在幕后不做任何关于单例 bean 的多线程行为的事情。处理单例 bean 的并发问题和线程安全是开发人员的责任。
我建议阅读以下文章:Spring Singleton, Request, Session Beans and Thread Safety
关于java - Spring单例线程安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15396608/