如何创建一个线程安全的单例类(保持状态)

时间:2011-09-09 19:10:08

标签: java jsp servlets thread-safety singleton

我知道单例类本质上不是线程安全的。但有没有办法让它成功呢?我在java Web应用程序中有一个单例,我希望每个用户都有一个类。

这是一个问题,因为单身人士持有州,否则就没事了。

3 个答案:

答案 0 :(得分:4)

  

我在java Web应用程序中有一个单例,我希望每个用户都有一个类。

将它变为单身是没有意义的。只需将其设为会话属性即可。 HttpSession与浏览器会话相关联,并且特定于每个访问者。例如,购物车:

Cart cart = (Cart) session.getAttribute("cart");

if (cart == null) {
    cart = new Cart();
    session.setAttribute("cart", cart);
}

// ...

它可以只是一个简单的Javabean。

另见:

答案 1 :(得分:2)

你的问题对我来说并不是很有意义,因为你要求“这个程序的每个用户都存在一个类”。我猜你的意思是你想要每个用户存在一个实例,在这种情况下你不是在寻找单例,而是在会话范围内查找bean的实例。

答案 2 :(得分:1)

单例对象是整个系统中只有一个实例的对象。

单身人士通常会采用这种模式:

public class Singleton {
   // Private constructor prevents instantiation from other classes
   private Singleton() {
   }

   /**
    * SingletonHolder is loaded on the first execution of Singleton.getInstance() 
    * or the first access to SingletonHolder.INSTANCE, not before.
    */
   private static class SingletonHolder { 
     public static final Singleton instance = new Singleton();
   }

   public static Singleton getInstance() {
     return SingletonHolder.instance;
   }
 }

有关单身人士的基本知识,请参阅http://en.wikipedia.org/wiki/Singleton_pattern