java - Java 中是否有在方法级别同步访问对象的设计模式或最佳实践?

标签 java concurrency

我正在编写一个 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/

相关文章:

java - itext 中的阿拉伯语

iphone - 在什么情况下GCD会对旧设备产生负面性能影响?

java - 如何知道 ScheduledExecutorService 何时完成

c++ - 强制将缓存行迁移到另一个核心

Python:如何组合两个函数的返回值并使用线程将它们附加到列表中?

java - hibernate中查询两个有PK FK关系的表

java - Cloudera Hadoop VM 没有eclipse

java - 调整并发 HashMap 的大小

java - 从 ArrayList<CustomObject> 中查找项目索引的更好方法

java - 模拟 post 请求时 Mockito InvalidUseOfMatchersException