If I have a Java class defined below that is injected in my web application via dependency injection:
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(); } }
I am concerned about thread safety. Does the Spring framework not handle cases where one request is reading from the list and it is currently being updated by another? I have used read/write locks before in other applications, but I have never thought about a case such as above before.
I was planning on using the bean as a singleton so I could reduce database load.
By the way, this is a follow up of the below question:
Java Memory Storage to Reduce Database Load – Safe?
EDIT:
So would code like this solve this problem:
/*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(); }
Answer
Spring framework does not do anything under the hood concerning the multithreaded behavior of a singleton bean. It is the developer’s responsibility to deal with concurrency issue and thread safety of the singleton bean.
I would suggest reading the below article: Spring Singleton, Request, Session Beans and Thread Safety