2016-10-01 54 views
2

我有關於鎖和同步的問題。在兩個對象上持有鎖

我有鎖對象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); 
    } 
} 

欲保持在兩個鎖定對象1和2,而方法c正在運行,在完成c後,兩個鎖都可以釋放。我怎樣才能做到這一點?我嘗試將它們放入for循環中,但方法ab只是開始和結束。

回答

1

有C方法在嵌套塊獲得兩個鎖:

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

內在鎖是可重入的,因此不要緊,方法A和B已經獲得它們。

如果您使多個方法執行此操作,請確保它們以相同的順序獲取鎖,以避免死鎖。

+0

謝謝你的回答:) – Felipe