java - Spring单例线程安全

标签 java multithreading spring

如果我在下面定义了一个 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/

相关文章:

java - 如何检测 libGdx 中的文本点击

C# 线程安全的静态成员

java - Mockito 不断返回空列表

java - Spring 启动时配置文件 : javax. sql.DataSource' 无法找到

java - 根据列表中的复选框创建新列表

java - 如何处理 apache Camel 中的 header

java - while 循环未执行

java - 使用处理程序多次触发可运行程序的效果

spring - RabbitMQ Spring Boot session 错误

java - 返回 unmodifiableList 是否可以接受,还是应该返回数组?