2016-04-08 13 views
1

Ich habe zwei Methoden, die beide von verschiedenen Threads ausgeführt werden, eine der Methoden, die ich nicht ausführen möchte, wenn der andere aufgerufen wurde. Dies ist der Grund, warum ich gewählt hat, eine SperreReentrantLock - Ist das ein gültiger Ansatz zur Verwendung?

@Override 
public synchronized void doSomething(int[] params) 
{ 
    while (lock.isLocked()) 
    { 
     // wait for it to become unlocked 
    } 

    //lock is released so lets do some stuff 

in meiner anderen Methode zu verwenden, habe ich die folgende Umsetzung

@Override 
public void doSomethingElse(int param) 
{ 
    lock.lock(); 
    for (int i = 0 ; i < param; i++) 
    { 
     //do some stuff 
    } 
    lock.unlock(); 
} 

Ist die while-Schleife die richtige Art und Weise zu sagen, mag ich diesen Thread warten hier, bis die Sperre aufgehoben wird, oder gibt es einen besseren Weg, diesen

Dank

Antwort

2

den implementieren, während Schleife tut beschäftigt Warten, die auf jeden Fall etwas, das Sie nicht wan t zu tun. Der Aufruf von lock.lock(); blockiert solange, bis die Sperre aufgehoben wird, also ist es die richtige Methode, genau wie bei der anderen Methode.

Sie müssen auch nicht die erste Methode synchronized, und die Sperre sollte immer in einer finally Klausel freigegeben werden.

2

Sie brauchen etwas wie folgt aus:

private void method1() 
{ 
    lock.lock(); 
    try { 
     ... 
    } finally { 
     lock.unlock(); 
    } 
} 

private void method2() 
{ 
    lock.lock(); 
    try { 
     ... 
    } finally { 
     lock.unlock(); 
    } 
} 

nicht versuchen Verwenden Sie forgeet {} finally {} oder man könnte mit Deadlock enden.

0

Beide falsch, ist die Standard-Praxis in der finally-Klausel zu entsperren. Andernfalls wird die Anwendung angehalten, wenn eine Ausnahme innerhalb des Codes ausgelöst wird, für den die Sperre gilt:

public void doSomethingElse(int param) throws Exception { 
    lock.lock(); 
    try { 
     //do some stuff that may throw exceptions 
    } finally { 
     lock.unlock(); 
    } 
} 
Verwandte Themen