Java 如何创建线程安全的单例类(保存状态)
我知道单例类本质上不是线程安全的。但有没有办法做到这一点?我在java web应用程序中有一个单例,我希望该程序的每个用户都有一个类 这是一个问题,因为singleton保持状态,否则就可以了 我在java web应用程序中有一个单例,我希望该程序的每个用户都有一个类 把它变成单身汉是没有意义的。只需将其设置为会话属性。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
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。这样可以避免在类可序列化时可能出现的潜在混乱。用约书亚·布洛赫的话来说,你的“单精灵”宇宙可以保持单精灵的状态。它相当于这一点,而且更简洁,尽管它让人觉得有些奇怪。