我正在编写一个 SDK,它向代表硬件设备的对象公开接口(interface)。
不允许多个线程同时访问该接口(interface)。对此的一个常见误用是让 GUI 线程(例如,在 Android 上)尝试与异步任务同时访问对象。
该对象不需要是可重入的。
对于 Java 来说,尤其是针对 Java 的并发概念,我目前还没有找到任何优雅的解决方案。这里的synchronized关键字并不合适,因为在调用方法b时,方法a不应该被自由调用,
'''java
public class A
{
private final Semaphore semaphore = new Semaphore(1);
private SomeNativeClass someNativeObject;
public boolean doSomething(int a){
try{
semaphore.acquire();
} catch (InterruptedException e){
return false;
}
if( false == someNativeObject.funcA()){
semaphore.release();
return false;
}
semaphore.release();
return true;
}
public boolean doSomethingElse(int b){
try{
semaphore.acquire();
} catch (InterruptedException e){
return false;
}
if( false == someNativeObject.funcD()){
semaphore.release();
return false;
}
if( false == someNativeObject.funcC()) {
semaphore.release();
return false;
}
semaphore.release();
return true;
}
}
我确信这会起作用,但发现它容易出错(特别是没有超出范围的析构函数从而释放信号量,就像在 C++ 中一样)
一般来说,这在 Java 中是如何完成的?我不想让客户端承担这个责任,因为实现是从接口(interface)中正确抽象出来的。
最佳答案
您可以使用synchronized
-关键字,因为它会同步this
-对象上的所有方法,因此doSomething()
和 doSomethingElse
不能同时运行:
public class A
{
private SomeNativeClass someNativeObject;
public synchronized boolean doSomething(int a){
return someNativeObject.funcA();
}
public synchronized boolean doSomethingElse(int b){
return someNativeObject.funcD() && someNativeObject.funcC();
}
}
如果您需要在其他对象上同步,您可以使用synchronized
-block
关于java - Java 中是否有在方法级别同步访问对象的设计模式或最佳实践?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57171351/