java类中的锁

时间:2012-02-04 18:27:33

标签: java multithreading deadlock locks

假设我们有下一个示例代码:

while(some condition){
    lock1.lock();
    .
    .
}

问题是:

假设某个线程在此代码部分运行并且lock1可用时,while循环的条件正在退出,是否有可能线程将检查循环的条件但仍然不会得到锁?

或者在这种情况下是否保证如果检查条件,则线程获得锁定?

2 个答案:

答案 0 :(得分:1)

简而言之:是的,有可能。

如果另一个线程已经获得了锁定,那么你的线程将被迫等待它获得空闲。

请记住,您无法知道两个或多个并发执行的线程如何交错其指令执行。假设两个线程A和B执行此代码。如果线程A发现条件为真,可能会在实际获取锁定之前(在评估while条件和调用之间)被抢占(由OS调度程序从CPU中取出)。 lock()),所以线程B也发现条件为true,取锁并且线程A等待。

答案 1 :(得分:0)

您不应将锁定基于其他线程可修改的条件,这种情况可能会影响锁内的代码。在获得锁定之前,无法保证条件不会发生变化。