java - 在 servlet 过滤器中同步代码

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

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

最佳答案

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

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

关于java - 在 servlet 过滤器中同步代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15962820/

相关文章:

java - 根据具有特定格式的日期对数组列表进行排序

java - Android 广播接收器没有接收到显式广播?

c++ - 教 gdb 从核心文件中理解微线程

java - 中断被阻塞的线程,等待来自套接字的输入

c - 关于用多线程实现 sleep 理发师时的同步

java - Eclipse Java 在项目资源管理器中打开项目时遇到困难

java - 如何用 unicode 字符替换 String

javascript - 在java中将DataURL图像转换为图像文件

java - 如何在 java servlet 和 JSP 中从 10g 中检索数据

MySQL 注册器数据使用 setString 数据,但不使用 getParameter