2013-01-06 15 views
8

Questo deve essere davvero ovvio, ma non riesco a individuare la risposta. Ho bisogno di mettere un lucchetto attorno a una variabile per garantire che vengano evitate un paio di condizioni di pericolo di gara. Da quello che posso vedere, una soluzione abbastanza semplice esiste utilizzando il Blocco, secondo la documentazione Android:Come posso creare un blocco (concurrent.locks.Lock) in Android?

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

Fin qui, tutto bene. Tuttavia, non riesco a far funzionare la prima linea. Sembrerebbe che qualcosa di simile:

Lock l = new Lock(); 

potrebbe essere corretto, ma eclissi rapporti, "Impossibile creare un'istanza del tipo di blocco" - e non di più.

Qualche suggerimento?

+2

google: blocco java sincronizzato – Leonidos

risposta

11

Se siete molto appassionato di utilizzare un Lock, è necessario scegliere un Lock implementazione come si non può interfacce istanziare. Come per la docs avete 3 scelte:

Probabilmente stai cercando il ReentrantLock possibilmente con qualche Condition s

Ciò significa che invece di Lock l = new Lock(); si dovrebbe fare:

ReentrantLock lock = new ReentrantLock(); 

Tuttavia, se tutto quello che' il bisogno di bloccare è una piccola parte, un blocco/metodo sincronizzato è più pulito (come suggerito da @Leonidos & @assylias).

Se si dispone di un metodo che imposta il valore, si può fare:

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

o se questa è una parte di un metodo più ampio:

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

Considerando lo scenario un blocco sincronizzato sarebbe probabilmente sufficiente. – assylias

+0

Grazie a tutti, posso procedere ora :-) –

1

Solo perché Lock è un'interfaccia e non può essere istanziato. Usa le sue sottoclassi.

Problemi correlati