java - 有没有办法让对象只能由访问特定方法的第一个线程使用?

标签 java multithreading concurrency thread-safety java-6

我想要一个可以由任何线程创建的对象,但是当线程调用 myObject.use() 时,它只能被该线程使用,直到 myObject.release() 被调用。

我不想强制开发人员必须将此对象/类的所有方法调用包装在同步块(synchronized block)中(我知道这可用于近似此功能),因为这可能会导致滥用对象如果他们忘记将所有从 myObject.use()myObject.release() 的调用包装在同一个同步块(synchronized block)中。

这可能吗?

可以用 ReentrantLock 来完成吗? ?

最佳答案

当然可以。 use() 方法应该是同步的,因此一次只能由一个线程调用,并将调用线程作为锁定线程存储在一个私有(private)的volatile 变量中。所有调用 - 包括 use() - 应该首先检查是否有存储的锁定线程并立即返回 - 或者如果你愿意的话抛出异常 - 如果有这样的线程并且它不匹配调用线程。 release() 也应该是同步的,并且可以删除存储的锁定线程,允许下一次调用 use() 来存储一个新的锁定线程。

关于java - 有没有办法让对象只能由访问特定方法的第一个线程使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37040380/

相关文章:

java - 终止执行程序服务和极快的 Java 代码?

java - 新线程卡住应用

java - 如何让Vaadin 10组件根据点击事件一一改变?

java - Fork-join: fork 所有子任务或为当前线程留下一个子任务

java - 用Java监控两台打印机

python - 在一段时间后杀死线程的大多数 Pythonic 方法

debugging - RejectedExecutionException和Clojure并发

java - 使用 JavaDoc 记录 Java 枚举的最佳方法是什么?

java - SAS token - 签名字段格式不正确

iphone - 我的应用程序在 Iphone SDK 3.2 上崩溃