2013-01-06 14 views
8

To musi być naprawdę oczywiste, ale nie mogę znaleźć odpowiedzi. Muszę umieścić blokadę wokół zmiennej, aby uniknąć sytuacji, w których kilka warunków wyścigowych jest zagrożonych. Z tego co widzę, to całkiem proste rozwiązanie istnieje używając Lock, zgodnie z android docs:Jak utworzyć blokadę (concurrent.locks.Lock) w systemie Android?

Lock l = ...; 
l.lock(); 
try { 
    // access the resource protected by this lock 
} 
finally { 
    l.unlock(); 
} 

Tak daleko, tak dobrze. Jednak nie mogę wykonać pierwszej linii pracy. Wydaje się, że coś takiego:

Lock l = new Lock(); 

Może być poprawne, ale zaćmienie raporty, „Nie można utworzyć wystąpienia typu zamka” - i nic więcej.

Wszelkie sugestie?

+2

google: blok synchronizowany java – Leonidos

Odpowiedz

11

Jeśli bardzo zależy na użyciu Lock, trzeba wybrać Lock wdrożenia jak ty nie Mogę instancji interfejsów. Jak na docs Masz 3 możliwości:

Pewnie szuka ReentrantLock ewentualnie z jakimiś Condition s

Oznacza to, że zamiast Lock l = new Lock(); byś zrobił:

ReentrantLock lock = new ReentrantLock(); 

Jednak jeśli wszystko” ponowne zablokowanie jest małą częścią, zsynchronizowany blok/metoda jest czystsza (zgodnie z sugestią @Leonidos & @assylias).

Jeśli masz metodę, która ustawia wartość, można to zrobić:

public synchronized void setValue (var newValue) 
{ 
    value = newValue; 
} 

lub jeśli jest to część większego metody:

public void doInfinite() 
{ 
    //code 
    synchronized (this) 
    { 
    value = aValue; 
    } 
} 
+0

Rozważając scenariusz, zsynchronizowany blok prawdopodobnie byłby wystarczający. – assylias

+0

Dziękuję wszystkim, że mogę przystąpić teraz :-) –

1

Tylko dlatego Lock jest interfejsem i nie można utworzyć instancji. Użyj jego podklas.

Powiązane problemy