1

私のアプリケーションには、 run メソッド while(true) 条件の下の Thread がこの OPeration を実行するシナリオがあります。

while true の状態では、外部データ ソース (Memcache) から継続的に情報をフェッチし、新しくログインしたユーザーまたはログアウトしたユーザーに応じてコンテンツを追加/削除し、最後に Memcache に更新します。

コードのスニペット

public class MonitoringThread extends Thread 
{
public void run() {
while(true)
String  response = Memcache.get("USERINFO");
// Some checks will be made on response and builds a new response and updates back to Memcache .
synchronized (response)
{
Memcache.set("USERINFO" , response) ;
}
}
}

私の質問は

  1. 設定操作で同期ブロックを保持しました (これは正しいですか)、または取得操作の実行中に行う必要がありますか??

  2. Synchronied ブロックに渡されるパラメーターは、これが this (クラス自体) であるか、String 応答であるかに関係なく、

いくつかの詳細情報。

アプリケーションは、ロード バランサーによって制御される 5 つの Web サーバー インスタンスで実行されます。(これらの 5 つのインスタンスはすべて、操作と更新データを取得するために実行されます)

あなたのアイデアを共有してください。

読んでくれてありがとう、素晴らしい一日を。

編集部分

返信ありがとうございます。

同期ブロック パラメータを変更しました。以下の実行可能なアプローチを教えてください。

オプション1

スレッドで同期ブロックを使用する

synchronized (Memcache.class)
{
Memcache.set("USERINFO" , response) ;
}


class Memcache
{
public static boolean set(String key, Object value) {
MemcacheClient.set(key, 0, value);
}

または

Memcache クラス自体で Synchronied ブロックを使用する

class Memcache
{
synchronized (Memcache.class)
{
public static boolean set(String key, Object value) {
MemcacheClient.set(key, 0, value);
}

// その他のメソッド }

4

2 に答える 2

2

文字列をロックすることは、毎回異なるオブジェクトをロックするため、役に立たない可能性があります。 Memcache必要なロックを実行する必要があります。そうでない場合は、同じオブジェクトをロックする必要があります。Memcache.class

于 2012-10-31T18:29:48.487 に答える
1

この同期ブロックで何をしようとしているのか、そもそもなぜ同期が必要なのかわかりません。同期ブロックで保護したい共有状態は何ですか?

とにかく、確かなことは、このスニペットはあまり意味がないということです。synchronized(response)つまり、2つのスレッドが両方ともキャッシュから同じStringインスタンス(同じ文字だけでなく同じオブジェクト)を受け取った場合、同期ブロックを実行できません。これは非常にありそうもないことであり、おそらくあなたが望むものではありません。

于 2012-10-31T18:32:08.820 に答える