如果有servlet,则在servlet容器(如Websphere )内。servlet由一些线程执行。我想问一下,这些线程共享什么?变量是如何在它们之间共享的?
他们是否有以下变量的本地副本?
1)私有/受保护/公共最终信号量许可=新信号量(50);
2)私有/受保护/公共最终静态信号量许可=新信号量(50);
3)私有/受保护/公共信号量许可=新信号量(50);
4)私有/受保护/公共静态信号量许可=新信号量(50);
我应该如何声明信号量,以便可以使用信号量来控制它们?我不希望他们每个人都有一份信号量的副本。谢谢。
发布于 2011-06-02 14:50:30
线程是由Websphere线程池运行的,您不应该担心通过它们访问它们或共享信息。
如果在servlet中声明信号量是静态的,那么它将被共享,只要使用它的所有类都存在于相同的类加载器下的同一应用程序中。然而,在这种情况下有一个很大的风险,如果您的执行路径没有释放许可(例如,由于异常),您可能会最终导致所有线程被阻塞。
发布于 2011-06-02 15:19:27
每个线程都有自己的堆栈,但都共享相同的内存空间。考虑到这一点,单个实例可以在多个线程之间共享,因此其状态/属性也可以共享。因此,我们需要使用同步或类似的技术来处理状态。
如果您定义了一个静态变量或将使用servlet的单个实例--这很有可能,但不能保证,那么它对所有线程都是相同的。
尽管如此,您应该创建一个类来提供在servlet中使用的单例信号量。这样,无论发生什么情况,servlet实例都将使用同一个信号量对象。
发布于 2011-06-02 14:48:11
如果您想要共享一个信号量,它必须由一个线程创建,然后在其他线程需要时(通过某种形式的(可能是静态的) getter方法)分发给其他线程。
如果您在每个对象中创建了信号量对象,那么它们都会有不同的对象,这就违背了这个目的。
https://stackoverflow.com/questions/6211298
复制相似问题