lock()方法获取哪个对象的锁?

时间:2016-11-20 09:25:53

标签: java concurrency locks

ngOnChanges(inputChanges) {
    if (inputChanges.pressedUp) {
        //do Something
    }

    if (inputChanges.pressDown) {
        //do Something
    }

    if (inputChanges.pressedEnter) {
        //do Something
    }
}

} //在上面的例子中我们说lck.lock();然后获得锁定 实际上哪个对象?这是"这个"或者" lck"本身?

即使在"""或" lck"宾语 然后如何差异。线程能够进入关键部分 被同一个"这个"锁定或" lck"对象

案例1:当我们在mark1使用synchronized(this)时 情况2:当我们在标记1处使用synchronized(lck)时。

在这两种情况下,两个循环并行运行。

2 个答案:

答案 0 :(得分:3)

lck.lock()获取的锁定(位于lck对象上)与synchronized(this)synchronized(lck)获取的锁完全无关。

如果你想保护关键部分,那么所有线程都必须使用相同的锁定机制(和相同的锁)。

java.util.concurrent.locks.Lock是针对synchronized关键字不够灵活的情况引入的不同机制。特别是,synchronized关键字会在执行进入和离开块时自动获取和释放锁。在一个方法中获取锁定是不可能的,将其存储在某个地方,保留方法并在以后某个时间释放锁定。使用Lock对象,您可以执行这些操作(并且还提供锁定等待超时,而synchronized可能会永久阻止)。

答案 1 :(得分:0)

@Thilo已经回答了大部分内容,只是为了在你的代码中添加一个点,确保你在finally块中解锁,如下所示,否则,你有可能会结束死锁

public void lockIt(){
    lck.lock();
  try {
    for(int i=0;i<10;i++) {
        System.out.println("i : "+ i);
        try{Thread.sleep(200);}catch (Exception e){}
    }
  } finally { //important
    if(lck != null) {
        lck.unlock();
    }
  }
}