2016-10-01 3 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, но методы a и b просто начинают и заканчивают.

ответ

1

Есть метод с приобретать оба замок во вложенных блоках:

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

Внутренних замков Реентрантные поэтому не имеет значения, что методы а ​​и б уже приобрести их.

Если вы делаете несколько способов, которые делают это, убедитесь, что они приобретают блокировки в том же порядке, чтобы избежать взаимоблокировок.

+0

Спасибо за ответ :) – Felipe

Смежные вопросы