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

我给的抽象代码:

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

我想使其线程安全。 condition1很少为true,因此由于同步而对性能的影响可忽略不计。因此,我可以执行以下任一操作:
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过滤器实例。

如果有人有不同意见,请告诉我。

最佳答案

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

如果将来某个时候需要在应用程序中实现新功能并向testObj添加其他访问权限,则必须在testObj上进行该同步,而在this上进行而不是同步。因此,您最好从一开始就做到这一点。

10-04 22:43
查看更多