2009-10-26 108 views
0

我的问题是关于正在排队的线程。对于我的例子,我有一个Spring上下文。我在无状态类中有一个名为CalculateTax的方法。一个请求进入,一个线程被创建(tA),并最终进入CalculateTax方法。在同一个“时间范围内”,另一个请求进入,另一个线程被创建(tB)。现在,这是我想要了解的。在tA退出该方法之前,AFAIK tB不能执行CalculateTax。这是真的?单身人士和线程

+1

在这个问题中没有引用Singleton的地方是Spring的上下文单例还是可以删除整个单例? – Janusz 2009-10-26 10:55:04

+0

也许他意味着他在Spring上下文中声明了他的bean是单例(Spring术语,不一定是该术语的经典含义),所以所有请求都获得相同的对象实例 - 因此担心并发。 – 2009-10-26 13:43:46

回答

2

不,它不是真的,如果它们是并行线程,每个线程都在它自己的执行堆栈中,所以它应该能够在执行tA时执行。

这是线程的用途。

+0

谢谢 - 正是我所需要的 – user195166 2009-10-26 10:30:37

+1

并且除非您没有使方法同步。 – 2009-10-26 10:54:30

+0

完全正确,除非你没有让他们同步 – OverLex 2009-10-26 14:39:27

3

只要CalculateTax只使用局部变量(即在方法中声明),就不会有任何线程同步问题,并且多个线程可以毫无问题地调用该方法。

但是,如果出于某种原因CalculateTax使用在类级别定义的变量,并且您使用的是单例模式(您用“singleton”标记了您的问题,所以我猜你是),但您可能会遇到线程同步问题。

+0

他说这个班是无国籍的。所以... – 2009-10-26 10:47:50

+0

啊,没有看到,谢谢 – JonoW 2009-10-26 10:56:17

0

一般来说,答案是不确定的。如果您的'请求'来自远程客户端,则答案取决于用于服务公开的机制的实现细节。

但是,我不知道真正使代理序列化请求的远程通信框架,也就是说,假定目标服务开发人员解决这个问题(例如,您的任务是为服务实现提供线程安全性,或者使用显式同步等将所有请求序列化)。