2017-08-31 3 views
0

Ich habe diese (vereinfacht) Szenario:ReentrantReadWriteLock auf demselben Thread

@Test 
public void testSameThread() throws InterruptedException { 
    ReentrantReadWriteLock rwlock = new ReentrantReadWriteLock(); 
    rwlock.readLock().lock(); 
    { 
     if (rwlock.writeLock().tryLock(50, TimeUnit.MILLISECONDS)) { 
      // long-running op 
      Thread.sleep(100); 
      rwlock.writeLock().unlock(); 
     } else { 
      fail(); 
     } 
    } 
    rwlock.readLock().unlock(); 
} 

Zuerst habe ich erwerben eine Lesesperre, dann auf dem gleichen Thread Ich versuche, die Schreibsperre zu erwerben. Meine Annahme ist, dass, während ich auf dem gleichen Thread bin, die Schreibsperre erworben werden sollte.

Erstens, was ist falsch mit meiner Annahme? Welches Muster (Standard-Java-Sperrmechanismus) kann dann verwendet werden, um beliebige verschachtelte Lese-/Schreibsperren für denselben Thread zuzulassen?

+0

Sie machen nur eine Annahme, hier und man bekam eine klare Antwort für sie, Ihre Frage lassen vermuten, dass etwas nicht funktioniert, wie Sie es erwarten, fügen Sie bitte mehr Details zu Ihrer Frage, was sind die erwarteten und beobachteten Verhaltensweisen? Was lässt Sie sagen, dass es nicht so funktioniert, wie Sie es erwarten? – A4L

Antwort

0

Nichts ist falsch mit Ihrer Annahme. Tatsächlich ist es keine Annahme, es ist eine gut dokumentierte Tatsache. Von ReentrantReadWriteLock.WriteLock.lock():

Erfasst die Schreibsperre, wenn weder der lesen noch schreiben Sperre durch andere Faden gehalten werden

Es wäre einspringenden nicht sein, wenn es blockiert, während sie mehrmals auf dem gleichen Thread zu erwerben .

¹In Tatsache nicht so gut, nachdem alle dokumentiert, siehe Kommentare Abschnitt

+0

Also, das ist ein Fehler in WriteLock impl? Was sollte ich stattdessen verwenden? –

+0

Nein, es ist ein Fehler in Ihrem Code, wenn Sie ein anderes Verhalten haben. Du bist der schwächste Link, nicht der bewährte JDK-Code, der von Leuten geschrieben wurde, die viel klüger sind als du. Nimm niemals einen Fehler im Code von jemand anderem an, bevor du es zu 200% sicher hast, dass es nicht in deinem ist. – Kayaman

+0

Wo ist der Fehler im Code (es ist nicht so komplex)? –

Verwandte Themen