“It depends.
”
我们可以把以上问题拆作两个问题来看:
首先, 一个stateless的对象一定就是线程安全(threadsafe)的吗?
正常情况来讲, 一个stateless对象基本上是线程安全的。你想啊,当前对象本身就没有共享的状态, 所有的操作基本上都限定(confine)到了方法的stack当中,这样的对象基本上就是线程安全的了。
但这只是说正常情况下, 相对应的,还有不正常的情况下。这些不正常的情况可能是, 不合适的对象引用的发布,或者引用了其它对象或者系统中的共享状态等。
例如,以下两种Stateless对象定义就不是线程安全的:
public class StatelessOne{
public void doSth(Map ctx)
{
// update ctx:Map to do something.
// other operations confined in method stack
}
}
public class StatelessTwo{
public void doSth()
{
Object someState = ref.getState(...);
Singleton ref = ...;
ref.doSth(someState);
// other operations confined in method stack
}
}
对于StatelessOne来说,如果它是单线程环境下使用,那么这样定义对象是没有问题的;但如果是在多线程环境下使用,则需要对方法参数的访问进行同步,或者选用Java5之后引入的ConcurrentHashMap等Map实现类;
对于StatelessTwo来说, 为了避免线程安全问题,可以使用ref提供的客户端锁进行同步,或者其它同步方式。
所以, 一个stateless对象不一定就是线程安全的, 视情况而定(it depends)。
其次,一个statefull的对象就一定是线程不安全(Non-Threadsafe)的吗?
正常来讲,一个stateful的对象很容易造成线程安全问题,比如, 最初设计为在单线程环境下的对象被应用到了多线程环境下,
应该同步的操作忘记同步等, 但这并不意味着一个stateful的对象就一定不是线程安全的, 它只是需要我们更多的“关心”和“呵护”而已。
public class StatefulOne{
private Map dataHolder = new HashMap();
public StatefulOne()
{
dataHolder.put(.., ..);
dataHolder.put(.., ..);
}
public void doSth()
{
Object value = dataHolder.get(..);
doSthWithValue(value);
// only get/read operations with dataHolder
}
}
对于StatefulOne对象定义来说,因为在发布之前对象即已经处于完备状态,且发布之后,对内部状态不进行更改,所以,它自身是线程安全的。但如果
我们不合适的添加某些状态暴露接口,那这种线程安全的状态就可能被打破,尝试为dataHolder添加对应的getter方法,或者在doSth()中
添加依据某个key对应的value的状态进行状态更新的操作。,然后你会想到哪些那?
实际上, 只要细心的“呵护”Stateful类型的对象,就可以得到一个线程安全的对象,并不意味着这个对象是stateful的,它就一定存在线程安全问题。
|
Tip
再思考, singleton, prototype和stateless, stateful对象之间有必然的对应关系吗?
|
分享到:
相关推荐
有状态stateful与无状态stateless地址转换技术分析 有状态(stateful)和无状态(stateless)地址转换是两种不同的地址转换技术,分别应用于不同的网络场景中。本文将对这两种技术进行详细分析,比较它们之间的差异,并...
react-native-stateless-form, 无状态的用于响应本机的窗体组件 react-native-stateless-form不再担心滚动和聚焦表单字段轻松显示图标和内联错误消息使用你想要的任何表单状态管理工具屏幕捕获 它做什么它通过...
authmagic-timerange-stateless-core 无状态和无密码...输入: user - 带有用户描述的对象,它将作为打开的信息添加到 JWT redirectUrl - 生成密钥后的重定向目的地字符串params - 带有用户描述的对象,它将作为打开
Stateless 是一个轻量级的状态机库,可以创建极简的状态机与对应的工作流。它支持各种类型作为状态和触发事件,支持状态继承,支持状态进入/离开事件,支持条件状态转移,支持状态/转移查询。 Stateless 的使用 ...
TRex无状态GUI TREX无国籍GUI应用程序提供了一种图形用户界面 。 描述和主要特点: TRex无状态GUI应用程序是基于JavaFX的应用程序。 该应用程序的主要功能可以分为树状部分(TRex管理,流量配置文件管理和数据包...
- Session Beans(会话bean):表示业务逻辑,分为Stateful(有状态)和Stateless(无状态)。 - Entity Beans(实体bean):持久化对象,代表数据库中的记录。 - Message-driven Beans(消息驱动bean):处理JMS...
有状态会话Bean(Stateful Session Bean,SFSB)与无状态会话Bean(Stateless Session Bean, SLSB)的主要区别在于它们如何维护与客户端之间的交互状态。SLSB不存储任何关于客户端的信息,每次方法调用都是独立的,...
`flask-stateless-auth`是一个与Flask框架相关的库,专门用于处理无状态身份验证。 “Python库”的标签表明这个文件是一个Python编程语言的软件库,意味着它提供了一组可重复使用的代码模块,开发者可以导入这些...
openflow-switch-extension-ext230-stateless.pdf openflow-switch-extension-ext232.pdf openflow-switch-extension-ext235.pdf openflow-switch-extension-ext236.pdf openflow-switch-extension-ext237.pdf ...
总的来说,"spring-security-stateless-example"项目提供了一个示例,展示了如何在Spring Boot应用中集成Cucumber进行集成测试,并且配置Spring Security以实现无状态安全。通过这个项目,开发者可以学习如何结合...
本文的价值不在于介绍几个进阶的模式,而在于教您如何有样学样,无样自己想,举一反三,创造出无限的新模式。换句话说,本文的用意不在于钓几条鱼(模式)给您吃,而在于教您应变能力,能在不同湖泊或大海中皆能...
适用于MastodonPHP Feed-to-Bot工具 一种用于为Mastodon创建机器人的工具,该机器人可以读取RSS / Atom提要。 特征: 一个脚本包含多个机器人 每个机器人多个提要 支持(有效)RSS和Atom 无状态:在某种意义上说...
(如:Stateful、Stateless、Singleton) - 描述EJB的容器管理的持久性(CMP)和Bean管理的持久性(BMP)。 4. **JMS(Java Message Service)** - JMS的作用是什么?它在J2EE中的应用场景有哪些? - 解释点对点...
WP-Stateless-事件日历插件发展历程运行测试: composer test 构建并发布新版本: composer release 1.0.0 ,其中1.0.0是GitHub上的标记版本。
综上所述,N-tier架构的基本设计模式强调了层次间的分离和协作,以及在Stateful和Stateless对象之间找到平衡,以构建高效且健壮的企业级信息系统。通过理解和应用这些模式,开发者能够创建出更稳定、可扩展和易于...
它在/target目录中生成stateless-rest-1.0.0-SNAPSHOT-runner.jar文件。 请注意,它不是über-jar,因为依赖项已复制到target/lib目录中。 现在可以使用java -jar target/stateless-rest-1.0.0-SNAPSHOT-runner....
标题 "stateless-future-util_2.11-0.1.0.zip" 提供的信息表明,这是一个软件库,可能是Scala编程语言的一个组件,因为版本号2.11对应于Scala的一个主要版本。"stateless-future-util"部分暗示这个库可能与无状态的...
- Session Bean:分为有状态(Stateful Session Bean)和无状态(Stateless Session Bean)两种,用于业务逻辑处理; - Entity Bean:用于持久化数据到数据库; - Message Driven Bean:用于异步消息处理。 - **...
WordPress无状态媒体插件描述使用WP-Stateless插件从Google Cloud Storage(GCS)上传并提供WordPress媒体。 在短短两分钟内,您将受益于通过Google Cloud的分布式服务器为媒体提供服务。 刚接触Google Cloud吗? ...
它提供了强大的功能和性能,同时支持stateful和stateless两种模式,以满足不同测试需求。TRex的独特之处在于其开源特性,可以作为昂贵商业仪表的替代品,尤其适合路由器厂商进行性能评估。 1. **TRex基本介绍** ...