同步servlet过滤器内的代码

时间:2013-04-12 04:00:13

标签: java multithreading servlets servlet-filters synchronized

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

我给的是抽象代码:

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

我想让它线程安全。 condition1很少会成立,因此同步会导致性能损失微不足道。所以我可以做以下任何事情:

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过滤器实例。

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

1 个答案:

答案 0 :(得分:1)

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

如果将来某个时候您需要在应用中实施新功能并添加对testObj的其他访问权限,则必须在testObj上进行同步,并且不要< / strong> on this。所以你不妨从一开始就这样做。