私のメソッドがスレッドセーフであるかどうかは疑いがありますが、逆にスレッドセーフではないことは確かですが、解決策はまだ見つかりませんでした。次 は私のコードです:はオブジェクトモニタで同期されていますが、私の場合はセマフォが良いでしょうか?
class TestLockSingleton
{
private static TestLockSingleton ourInstance = new TestLockSingleton();
public static TestLockSingleton getInstance() {
return ourInstance;
}
private TestLockSingleton() {
}
...
private Object LockMonitor= new Object();
interface Listener
{
void isEnable(boolean result);
}
public void setStatus(int status){
synchronized(LockMonitor){
this.status = status;
this.setted = true;
}
}
public void isEnable(final Listener listener){
synchronized(LockMonitor){
if(!setted){
LocalBroadcastManager.getInstance(context).registerReceiver(new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
synchronized(LockMonitor){
Bundle bundle = intent.getExtras();
setStatus(bundle.getInt("Status", OFFVALUE));
Listener.isEnable((status==ACTIVEVALUE)?true:false);
LocalBroadcastManager.getInstance(context).unregisterReceiver(this);
}
}
},new IntentFilter(MYACTION));
}else{
Listener.isEnable((status==ACTIVEVALUE)?true:false);
}
}
}
....
}
は今私の問題は、私はTestLockSingletonクラス内のメソッドisEnable(最終リスナーリスナー)がスレッドセーフではないと思われるということです。
複数のリスナーを処理する必要はありません。代わりに、メソッドisEnable(最終リスナーリスナー)を呼び出した最後のユーザーがコールバックを受け取るようにする必要があります。
しかし、2つの異なるスレッドがisEnable(最終リスナーリスナー)を呼び出す場合、メソッドを呼び出した最後のスレッドは2つのリスナーコールバックを受信しますか?
編集:私は、「状態」変数がすでにisEnableへ 先例コール(最終リスナーリスナー)からsettedされていない場合にのみ、受信機を登録したい
- 、:私はこの外挿したコードでやりたいんこれを行うために、私は "設定された"変数を作成し、それを私が状態変数を設定するのと同時にtrueに設定します。
TestLockSingleton.getInstance().isEnable( new Listener() { @Override public void isEnable(boolean result) { } })
:
は一度に1つのボークスレッド:私はこれを達成したい
"をsetted" への同時アクセスを防止するために同期され、 "ステータス" メンバ変数を使用
- スレッドBは時刻2に同じことをします
スレッドBはリスナーレスを受信するなぜなら、もし私がそのスレッドBが2つのコールバックを同じ結果で受け取るならば、私は複数のBroadcastReceiverを登録することを防ぎます。
あなたは何を達成しようとしていますか?このコードはそのままではコンパイルされません。ある時点で複数の放送受信機がインストールされないように同期を使用しようとしていますか? –
こんにちは!私の質問を読んでくれてありがとう。私の悪い英語のために申し訳ありません。最初のメッセージを編集して詳しい説明をしました。 私の実際のコードのfaqsimileなので、このコードはコンパイルされません。 – aeroxr1