Java 如何创建线程安全的单例类(保存状态)

Java 如何创建线程安全的单例类(保存状态),java,jsp,servlets,thread-safety,singleton,Java,Jsp,Servlets,Thread Safety,Singleton,我知道单例类本质上不是线程安全的。但有没有办法做到这一点?我在java web应用程序中有一个单例,我希望该程序的每个用户都有一个类 这是一个问题,因为singleton保持状态,否则就可以了 我在java web应用程序中有一个单例,我希望该程序的每个用户都有一个类 把它变成单身汉是没有意义的。只需将其设置为会话属性。HttpSession与浏览器会话绑定,并针对每个访问者。例如,购物车: Cart cart = (Cart) session.getAttribute("cart&q

我知道单例类本质上不是线程安全的。但有没有办法做到这一点?我在java web应用程序中有一个单例,我希望该程序的每个用户都有一个类

这是一个问题,因为singleton保持状态,否则就可以了

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

把它变成单身汉是没有意义的。只需将其设置为会话属性。
HttpSession
与浏览器会话绑定,并针对每个访问者。例如,购物车:

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

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

// ...
它可以只是一个简单的Javabean

另见:

    • 你的问题对我来说没有多大意义,因为你要求“这个程序的每个用户都有一个类”。我猜你的意思是你希望每个用户都有一个实例,在这种情况下,你不是在寻找一个单例,但是会话范围内的bean实例。

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

      如今,单身人士通常采取这种模式:

      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;
         }
       }
      

      有关singleton的基础知识,请参见

      singleton如何比任何其他类的线程安全性更低?如果有许多副本,它就不是singleton。不过现在流行的做法是在枚举的上下文中实例化singleton。这样可以避免在类可序列化时可能出现的潜在混乱。用约书亚·布洛赫的话来说,你的“单精灵”宇宙可以保持单精灵的状态。它相当于这一点,而且更简洁,尽管它让人觉得有些奇怪。