拿着锁在两个物体上

时间:2016-10-01 01:03:59

标签: java multithreading locking thread-synchronization

我对锁和同步有疑问。

我有一个锁定对象1的方法,以及锁定对象2的其他方法:

private void a(){
    synchronized(obj1){
        System.out.println("Object 1 being used");
    }
        System.out.println("Object 1 finished");

}

private void b(){
    synchronized(obj2){
        System.out.println("Object 2 being used");
    }
        System.out.println("Object 2 finished");

}

我还有第三种方法:

private void c(){
for(int i=0;i<=0;i++){
        a();
        b();
        Thread.sleep(2000);
    }
}

我希望在方法c运行时对两个对象1和2保持锁定,在c完成后,两个锁都可以释放。我怎样才能做到这一点?我尝试将它们放入for循环,但方法ab只是开始和结束。

1 个答案:

答案 0 :(得分:1)

让c方法获取嵌套块中的两个锁:

synchronized (obj1) {
    synchronized (obj2) {
         // c method logic here
    }
}

内在锁是可重入的,所以方法a和b已经获得它们并不重要。

如果您使用多个方法执行此操作,请确保它们以相同的顺序获取锁定,以避免死锁。