首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >关于servlet多线程环境的问题

关于servlet多线程环境的问题
EN

Stack Overflow用户
提问于 2011-06-02 14:41:51
回答 7查看 1.3K关注 0票数 1

如果有servlet,则在servlet容器(如Websphere )内。servlet由一些线程执行。我想问一下,这些线程共享什么?变量是如何在它们之间共享的?

他们是否有以下变量的本地副本?

1)私有/受保护/公共最终信号量许可=新信号量(50);

2)私有/受保护/公共最终静态信号量许可=新信号量(50);

3)私有/受保护/公共信号量许可=新信号量(50);

4)私有/受保护/公共静态信号量许可=新信号量(50);

我应该如何声明信号量,以便可以使用信号量来控制它们?我不希望他们每个人都有一份信号量的副本。谢谢。

EN

回答 7

Stack Overflow用户

发布于 2011-06-02 14:50:30

线程是由Websphere线程池运行的,您不应该担心通过它们访问它们或共享信息。

如果在servlet中声明信号量是静态的,那么它将被共享,只要使用它的所有类都存在于相同的类加载器下的同一应用程序中。然而,在这种情况下有一个很大的风险,如果您的执行路径没有释放许可(例如,由于异常),您可能会最终导致所有线程被阻塞。

票数 2
EN

Stack Overflow用户

发布于 2011-06-02 15:19:27

每个线程都有自己的堆栈,但都共享相同的内存空间。考虑到这一点,单个实例可以在多个线程之间共享,因此其状态/属性也可以共享。因此,我们需要使用同步或类似的技术来处理状态。

如果您定义了一个静态变量或将使用servlet的单个实例--这很有可能,但不能保证,那么它对所有线程都是相同的。

尽管如此,您应该创建一个类来提供在servlet中使用的单例信号量。这样,无论发生什么情况,servlet实例都将使用同一个信号量对象。

票数 2
EN

Stack Overflow用户

发布于 2011-06-02 14:48:11

如果您想要共享一个信号量,它必须由一个线程创建,然后在其他线程需要时(通过某种形式的(可能是静态的) getter方法)分发给其他线程。

如果您在每个对象中创建了信号量对象,那么它们都会有不同的对象,这就违背了这个目的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6211298

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档