【发布时间】:2012-02-19 06:10:51
【问题描述】:
我有一个启动几个线程的类。每个线程(扩展线程)调用类 WH 的一个新实例,类 WH 有一个要在所有线程之间共享的变量。所以层次结构看起来像:
class S extends Thread {
....
....
WH n = new WH(args);
....
....
}
现在 WH 类有一个要共享的变量,声明为:
private static volatile Integer size;
One of the functions tries to access size through Synchronized:
Synchronized (size) { // Program gets stuck at this line
... stuff ...
}
即使我只生成一个线程,它也会卡住。知道为什么会这样吗? (仅供参考-根据我的设计选择,我不想使用 AtomicInteger)
谢谢
【问题讨论】:
-
好吧,你的设计选择现在不起作用,
AtomicInteger就是为这个确切的用例而设计的。共享状态很难正确执行,最好使用其他人设计、测试和证明的工具。祝你好运。 -
我不能使用 AtomicInteger 因为我需要获取大小的值,检查它的条件,并根据条件增加或不增加。所以我必须做一个 get 然后可能会增加它。在那种情况下我仍然需要锁定。另外,如果我使用 ConcurrentHashMap 它也会卡住。
-
尝试在
Synchronized关键字中使用另一个锁,例如WH.class(如果没有在其他地方使用)。
标签: java multithreading concurrency synchronized