【问题标题】:Is there a way to make an object usable only by the first thread that accesses a specific method?有没有办法使对象只能由访问特定方法的第一个线程使用?
【发布时间】:2016-05-05 00:32:53
【问题描述】:

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

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

这可能吗?

可以通过ReentrantLock 完成吗?

【问题讨论】:

  • 定义由该线程使用
  • 对我来说听起来像一个对象池
  • @SotiriosDelimanolis 线程中的某个实例调用 myObject 实例的方法
  • @ElliottFrisch 这可能是个好主意。你能多说一下为什么这比在类定义本身中实现这个功能更好吗?
  • 如果另一个线程这样做了,您希望发生什么?我认为@ElliottFrisch 在这里是正确的。

标签: java multithreading concurrency thread-safety java-6


【解决方案1】:

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

【讨论】:

  • 对我们不维护的类库有什么办法吗?还是只有叉子?让我了解 jRat 的工作原理
  • @AquariusPower 您可以将库类包装在您自己的类中。
猜你喜欢
  • 2020-05-01
  • 1970-01-01
  • 2016-03-31
  • 2018-11-08
  • 1970-01-01
  • 1970-01-01
  • 2021-02-04
  • 1970-01-01
  • 2013-09-03
相关资源
最近更新 更多