是否可以在一种方法中获取锁并从另一种方法中释放它?

GC_*_*GC_ 1 java multithreading locking thread-safety

我基本上是在使用一个框架工作,从两个不同的线程调用一堆函数.我希望在允许下一个线程继续之前完成一个完整的线程.但是,我无法更改代码.

例如,假设有两个线程,线程1和线程2.每个线程调用方法一到三.

所以你得到一个类似的电话订单:

T1-M1
T1-M2
T2-M1
T1-M3
T2-M2
T2-M3

但是,我想要发生的是T1-M1设置某种阻止T2的锁,所以顺序如下.

T1-M1 - get lock
        T2-M1 - blocked
T1-M2
T1-M3 - release lock

T2-M1 - no longer blocked - gets lock
T2-M2
T2-M3

是否可以在Java中执行此操作而无需从框架中编辑调用方法?

Joa*_*uer 6

您不能使用synchronized关键字提供的简单功能来执行此操作:必须以获取它的相同方法(甚至块)释放其锁定.

但是,您可以使用这些工具java.util.concurrent.locks.

它的ReentrantLock类几乎是机制的具体化synchronized.

但请记住,这种方法很危险.如果一个线程调用M1M2,但从来没有要求M3?例如,在调用M2和之间的某些代码中可能会出现异常M3.