私はいくつかのスレッドを開始するクラスを持っています。各スレッド(extends Thread)は、クラスWHの新しいインスタンスを呼び出し、クラスWHは、すべてのスレッド間で共有される変数を持ちます。だから、階層は次のようになります。それは、私はちょうど1スレッドをオフに産卵しても立ち往生synchronizedキーワードを使用するとJavaアプリケーションがスタックする
private static volatile Integer size;
One of the functions tries to access size through Synchronized:
Synchronized (size) { // Program gets stuck at this line
... stuff ...
}
:
class S extends Thread {
....
....
WH n = new WH(args);
....
....
}
今クラスWHを共有する変数は、と宣言しています。なぜこれが起こっているのか? (私は私の設計の選択に基づいてのAtomicIntegerを使用したくないFYI-)
おかげ
よく**あなたの**デザインの選択肢は今は動作していません。そして、 'AtomicInteger'はこの正確な使用例のためだけに設計されています。共有状態は正しく実行するのが難しく、他のツールが設計しテストし実証したツールを最大限に活用してください。がんばろう。 –
AtomicIntegerは使用できません。サイズの値を取得し、条件をチェックし、条件に基づいてインクリメントするかどうかを判断する必要があるからです。だから私はそれを可能な限り増やす必要があります。その場合はまだロックが必要です。また、ConcurrentHashMapを使用すると、スタックされてしまいます。 –
'Synchronized'キーワードで別のロックを使用しようとします。たとえば、' WH.class'(別の場所で使用されていない場合)です。 –