gpt4 book ai didi

Struts ScopeInterceptor 类中的 Java 线程安全问题?

转载 作者:行者123 更新时间:2023-12-03 06:04:01 25 4
gpt4 key购买 nike

我试图了解 Struts2 ScopeInterceptor 类 (/org/apache/struts2/interceptor/ScopeInterceptor.java) 内部是否存在线程安全问题,以下是有问题的代码:

    private static Map locks = new IdentityHashMap();

static final void lock(Object o, ActionInvocation invocation) throws Exception {
synchronized (o) {
int count = 3;
Object previous = null;
while ((previous = locks.get(o)) != null) {
if (previous == invocation) {
return;
}
if (count-- <= 0) {
locks.remove(o);
o.notify();

throw new StrutsException("Deadlock in session lock");
}
o.wait(10000);
}
;
locks.put(o, invocation);
}
}

static final void unlock(Object o) {
synchronized (o) {
locks.remove(o);
o.notify();
}
}

我有一个 Websphere 应用程序,显示有 45 个停滞线程,CPU 使用率很高。 33 个线程在“unlock”方法内的“locks.remove(o)”处停止。其他 12 个线程在“lock”方法内的“locks.get(o)”内停止。

在我看来,IdentityHashMap 的使用是线程不安全的。简单地用 Collections.synchronizedMap() 包装 IdentityHashMap 可以解决这个问题吗?:

    private static Map locks = Collections.synchronizedMap(new IdentityHashMap());

static final void lock(Object o, ActionInvocation invocation) throws Exception {
synchronized (o) {
int count = 3;
Object previous = null;
while ((previous = locks.get(o)) != null) {
if (previous == invocation) {
return;
}
if (count-- <= 0) {
locks.remove(o);
o.notify();

throw new StrutsException("Deadlock in session lock");
}
o.wait(10000);
}
;
locks.put(o, invocation);
}
}

static final void unlock(Object o) {
synchronized (o) {
locks.remove(o);
o.notify();
}
}

在我看来,作者试图通过使用同步代码块来“修复”IdentityHashMap 的同步问题,但是如果对象“o”是特定于线程的对象,则这不能防止多线程。而且,由于锁定和解锁中的代码块是分开的,因此 IdentityHashMap 将(而且确实!)被多个线程同时调用(根据我们的 Java 核心证据)。

Collections.synchronizedMap() 包装器是正确的修复吗,还是我遗漏了什么?

最佳答案

我相信你是对的,似乎存在线程安全问题。开发人员试图通过同步对象“o”来实现线程安全,但看起来该对象实际上是 session 对象,而不是范围更广泛的对象。我相信更改需要在锁对象上同步。

关于Struts ScopeInterceptor 类中的 Java 线程安全问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18985094/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com