使用单例对象时,我们必须确保其中的所有内容及其调用的所有内容都必须是线程安全的
利用单例对象来处理客户端请求是一种好习惯吗?
由于对象实例是单例,如果它在处理客户端请求的过程中,同时又有另一个请求到达,则使用新的客户端数据调用相同的实例。会不会使事情变得混乱?
取决于对象是否保存任何可变数据。
如果对象只是纯函数和不可变状态的持有者,那么有多少线程同时使用它并不重要,因为它们不能通过共享状态相互影响。
如果对象具有可变状态,那么如果您从多个线程访问该对象而没有某种锁定,则肯定会出错,无论是在对象内部还是外部。”>
因此,只要没有易变的状态,这就是一个好习惯。这是在相同名称空间下收集相关方法或创建全局函数(通过定义apply
方法)的好方法。
使用单例对象时,我们必须确保其中的所有内容及其调用的所有内容都必须是线程安全的
javax.crypto.Cipher
似乎不是线程安全的,因此可能不应单例调用它。考虑guice如何使用javax.crypto.Cipher
指定线程安全意图:@Singleton
还考虑Play框架的示例,其中开始版本
@Singleton
开始脱离单例控制器,并开始鼓励类控制器。
使用单例对象时,我们必须确保其中的所有内容及其调用的所有内容都必须是线程安全的