“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地址转换.docx
react-native-stateless-form, 无状态的用于响应本机的窗体组件 react-native-stateless-form不再担心滚动和聚焦表单字段轻松显示图标和内联错误消息使用你想要的任何表单状态管理工具屏幕捕获 它做什么它通过...
authmagic-timerange-stateless-core 无状态和无密码...输入: user - 带有用户描述的对象,它将作为打开的信息添加到 JWT redirectUrl - 生成密钥后的重定向目的地字符串params - 带有用户描述的对象,它将作为打开
TRex无状态GUI TREX无国籍GUI应用程序提供了一种图形用户界面 。 描述和主要特点: TRex无状态GUI应用程序是基于JavaFX的应用程序。 该应用程序的主要功能可以分为树状部分(TRex管理,流量配置文件管理和数据包...
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 ...
本文的价值不在于介绍几个进阶的模式,而在于教您如何有样学样,无样自己想,举一反三,创造出无限的新模式。换句话说,本文的用意不在于钓几条鱼(模式)给您吃,而在于教您应变能力,能在不同湖泊或大海中皆能...
适用于MastodonPHP Feed-to-Bot工具 一种用于为Mastodon创建机器人的工具,该机器人可以读取RSS / Atom提要。 特征: 一个脚本包含多个机器人 每个机器人多个提要 支持(有效)RSS和Atom 无状态:在某种意义上说...
ESP8266-HomeKit-Stateless-Button-Elgato-Eve-Button:基于ESP8266的HomeKit Stateless Button,类似于使用Wi-fi的Elgato Eve Button
资源来自pypi官网。 资源全名:flask-stateless-auth-0.0.13.tar.gz
WP-Stateless-事件日历插件发展历程运行测试: composer test 构建并发布新版本: composer release 1.0.0 ,其中1.0.0是GitHub上的标记版本。
春天安全无状态的例子该项目演示了如何配置Spring Security,以提供无状态安全性以及大多数默认行为,例如,未登录时重定向到登录页面,登录后重定向到默认页面等等。
主要介绍了C# 状态机Stateless的的相关资料,文中讲解非常详细,代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下
它在/target目录中生成stateless-rest-1.0.0-SNAPSHOT-runner.jar文件。 请注意,它不是über-jar,因为依赖项已复制到target/lib目录中。 现在可以使用java -jar target/stateless-rest-1.0.0-SNAPSHOT-runner....
WordPress无状态媒体插件描述使用WP-Stateless插件从Google Cloud Storage(GCS)上传并提供WordPress媒体。 在短短两分钟内,您将受益于通过Google Cloud的分布式服务器为媒体提供服务。 刚接触Google Cloud吗? ...
如果你在寻找Linux上配置诸如Cisco设备上的static双向NAT的方法,这个或许就是你想要的; what?你觉得它完不成PAT?是的,它不行。但是想做PAT为何不使用现有的iptables实现呢?它可以自动为你解决元组唯一性问题...
开源项目-Rican7-retry.zip,retry - A simple, stateless, functional mechanism to perform actions repetitively until successful
cd stateless-workstation-config ./deploy.sh 在Windows版Ubuntu上的用法 sudo apt install git git clone https://github.com/cristiklein/stateless-workstation-config.git cd stateless-workstation-config ./...
static-stateless-2-way-NAT-on-Linux-with-iptables perform a static stateless 2-way NAT with iptables 如果你在寻找Linux上配置诸如Cisco设备上的static双向NAT的方法,这个或许就是你想要的; what?你觉得它...
jar包,官方版本,自测可用
针对这个问题,提出了TGPSR(Two-hop Greedy Perimeter Stateless Routing)路由协议:每个节点维持两跳的邻居节点列表,显著增加了对目的节点位置信息的容忍度,在位置信息不够准确的情况下也可以把数据包发送到...