2016-05-29 10 views
0

Ich habe zwei verschiedene Objekte, sondern sie ist gleich (obj1! = Obj2, aber obj1.equlas (obj2))Mit Hilfe verschiedene Objekte für eine Synchronisation/lock in Java

Wie kann ich Synchronisations-/Sperre für diesen Einsatz Objekte wie eins? Zum Beispiel:

... 
synchronized(obj) { 
     doSomething(obj); 
} 
... 

Ich mag es sperren, wenn eine der equals() Objekt bereits etwas in der gleichen Zeit zu tun.

+0

Sperren verwenden in Java keine equals.Lock ist auf Object-Instanz selbst. –

+0

Ich weiß es und meine Frage ist, wie es mit equals() umgesetzt werden kann – AskProgram

+0

Was soll passieren, wenn sie nicht gleich sind? Keine Synchronisation überhaupt? Synchronisation von beiden? .. –

Antwort

0

Es gibt keine Möglichkeit, nur ein synchronisiertes Objekt zu verwenden und beide Objekte zu synchronisieren.

Die Lösungen sind:

synchronized (obj) { 
     synchronized (obj2) { ...... 

aber wenn Sie die Reihenfolge, in onother Faden umkehren können Sie eine tote Sperre erhalten.

oder die andere Lösung, die ich vorschlage, ist, Ihre obj statisch zu machen und zu synchronisieren.

Was Sie haben, ist sinnvoll gleich Objekte, aber die Referenz der Variablen, die Sie für Obj und Obj2 haben, zeigen für verschiedene Objekte.

0

ich nicht sagen kann ich voll und ganz verstehen, warum dies erforderlich werden könnte, aber Wrapper-Ansatz kann möglicherweise helfen:

public class SyncOnEquals { 
    public synchronized Object getSync(Object o1, Object o2) 
    { 
     if(o1.equals(o2)) 
      return this; 
     else 
      return o1; 
    } 
} 

Test:

@org.junit.Test 
public void testSyncOnEqual() { 
System.out.println("syncOnEqual"); 
Integer o1 = new Integer(125); 
Integer o2 = new Integer(125); 

System.out.println("o1 == o2: "+(o1==o2)); 
System.out.println("o1.equals(o2): "+o1.equals(o2)); 
SyncOnEquals sync = new SyncOnEquals(); 

Thread t1 = new Thread(){ 
    public void run() 
    { 
     System.out.println("Waiting thread "+Thread.currentThread()); 
     synchronized(sync.getSync(o1, o2)) 
     { 
      System.out.println("Working thread "+Thread.currentThread()); 
      try { 
       Thread.currentThread().sleep(1000); 
      } catch (InterruptedException ex) { 
       ex.printStackTrace(); 
      } 
     } 
     System.out.println("Finished thread "+Thread.currentThread()); 
    } 
}; 

Thread t2 = new Thread(){ 
    public void run() 
    { 
     System.out.println("Waiting thread "+Thread.currentThread()); 
     synchronized(sync.getSync(o2, o1)) 
     { 
      System.out.println("Working thread "+Thread.currentThread()); 
      try { 
       Thread.currentThread().sleep(500); 
      } catch (InterruptedException ex) { 
       ex.printStackTrace(); 
      } 
     } 
     System.out.println("Finished thread "+Thread.currentThread()); 
    } 
}; 

t1.start(); 
t2.start(); 

try{ 
    Thread.currentThread().sleep(2000); 
} catch (InterruptedException ex) { 
    ex.printStackTrace(); 

    } 
} 

Ausgang:

syncOnEqual 
o1 == o2: false 
o1.equals(o2): true 
Waiting thread Thread[Thread-0,5,main] 
Waiting thread Thread[Thread-1,5,main] 
Working thread Thread[Thread-0,5,main] 
Finished thread Thread[Thread-0,5,main] 
Working thread Thread[Thread-1,5,main] 
Finished thread Thread[Thread-1,5,main] 
+0

Danke, es könnte für mich hilfreich sein! – AskProgram

+0

@AskProgram bitte vergessen Sie nicht, die Antwort zu markieren, die tatsächlich funktioniert hat. –