在对象监视器上同步,或者在我的情况下,最好是信号量



我有一个疑问,如果我的方法是线程安全或不相反,我很确定是不是线程安全,但我还没有找到一个解决方案。下面是我的代码:

    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 );
                }
            }
        }
    ....
    }

现在我的问题是,我认为方法isEnable(最终监听器监听器)内部TestLockSingleton类不是ThreadSafe。

我不想处理多个侦听器,相反,我必须确保最后一个调用方法isEnable(最后一个侦听器侦听器)的人将收到回调。

但是如果两个不同的线程调用isEnable(final Listener Listener),最后一个调用该方法的线程将收到两个侦听器回调?

编辑:我想用这个外推代码做什么:

  • 我想注册接收器只有当"状态"变量还没有从a设置先例调用isEnable(final Listener Listener),为此,我创建了一个"set"变量,并在设置状态变量的同时将其设置为true。
  • 我使用synchronized来防止并发访问"set "one_answers"status"成员变量
  • 我想完成这个:

    线程A在时间1调用:

          TestLockSingleton.getInstance().isEnable(
              new Listener()
       {
                   @Override
             public void isEnable(boolean result) {
            }
      })
    

    线程B在时间2做同样的事情

    我希望只有线程B接收Listener结果,我将防止注册多个BroadcastREceiver,因为如果我这样做,线程B接收两个回调具有相同的结果。

我想你想要类似下面的代码。

你必须小心。Listener.isEnable将被多个线程调用:调用TestLockingSingleton.isEnable的线程和主线程。

public class TestLockSingleton {
  // ...
  public interface Listener {
    void isEnable(boolean isActive);
  }
  private static TestLockSingleton instance = new TestLockSingleton();
  public static TestLockSingleton getInstance() {
    return instance;
  }

  private final Object lock = new Object();
  private int status;
  private boolean enabled;
  private TestLockSingleton() {
  }
  public void setStatus(int status) {
    synchronized (lock) {
      this.status = status;
      this.enabled = true;
    }
  }
  public void isEnable(Context context, final Listener listener) {
    boolean enabled;
    boolean active;
    synchronized (lock) {
      enabled = this.enabled;
      active = status == ACTIVEVALUE;
    }
    if (enabled) {
      listener.isEnable(active);
      return;
    }
    LocalBroadcastManager.getInstance(context).registerReceiver(
      new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
          int status = intent.getExtras().getInt("Status", OFFVALUE);
          setStatus(status);
          listener.isEnable(status == ACTIVEVALUE);
          LocalBroadcastManager.getInstance(context).unregisterReceiver(this);
        }
      },
      new IntentFilter(MYACTION));
  }
  // ...
}

Edited:防止TestLockSingleton.isEnable在调用Listener.isEnable时持有锁。不清楚这种情况下是否需要

相关内容

最新更新