3

我有一个 servlet 过滤器,在其中我需要使一些代码成为线程安全的。

我给出了抽象代码:

doFilter() {
{
......
if (condition1) {
TestClass testObj = StaticTestClass.getTestObj();
testObj = testObj.setTestStr(testObj.getTestStr() + "Success");
StaticTestClass.setTestObj(testObj);
}
.....
}

我想让它线程安全。条件 1 很少为真,因此由于同步而对性能的影响可以忽略不计。所以我可以做以下任何事情:

doFilter() {
{
......
if (condition1) {
TestClass testObj = StaticTestClass.getTestObj();
synchronized(this) {
testObj = testObj.setTestStr(testObj.getTestStr() + "Success");
StaticTestClass.setTestObj(testObj);
}}
......
}

或者

doFilter() {
{
......
if (condition1) {
TestClass testObj = StaticTestClass.getTestObj();
synchronized(testObj) {
testObj = testObj.setTestStr(testObj.getTestStr() + "Success");
StaticTestClass.setTestObj(testObj);
}}
......
}

根据我的理解,从概念上讲,第二个更准确,因为它锁定了 testObj。但是第一个也是正确的,因为容器中只有一个 servlet 过滤器实例。

请让我知道是否有人有不同的意见。

4

1 回答 1

2

您的理解是正确的:第二个选项是两者中更正确的一个,因为同步语句的目标是访问testObj,而不是this

如果在未来的某个时间点您需要在您的应用程序中实现新功能并添加其他访问权限testObj,您将必须启用该同步testObj,而不是启用该同步this。所以你不妨从一开始就做到这一点。

于 2013-04-12T22:14:54.053 回答