我有一个疑问,如果我的方法是线程安全或不相反,我很确定是不是线程安全,但我还没有找到一个解决方案。下面是我的代码:
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
时持有锁。不清楚这种情况下是否需要