Java 演示ReadWriteLock使用的示例

Java 演示ReadWriteLock使用的示例,java,multithreading,locking,reentrantlock,Java,Multithreading,Locking,Reentrantlock,我试图理解ReadWriteLock的概念,并实现了下面的简单示例。据我所知,每当一个线程具有readlock,另一个线程就可以获得readlock。但是对于具有writelock的线程,只有在另一个线程释放锁之前,其他线程才能获取写/读锁。然而,从下面程序的输出中,我注意到在WriterOdd释放锁(打印释放锁的输出)之前,Reader线程进入并读取number字符串。是因为刚刚释放写锁之后,读卡器线程进来,然后打印了释放写锁的打印语句吗 public static void main(Str

我试图理解
ReadWriteLock
的概念,并实现了下面的简单示例。据我所知,每当一个线程具有
readlock
,另一个线程就可以获得
readlock
。但是对于具有
writelock
的线程,只有在另一个线程释放锁之前,其他线程才能获取
写/读锁。然而,从下面程序的输出中,我注意到在
WriterOdd
释放锁(打印释放锁的输出)之前,
Reader
线程进入并读取
number
字符串。是因为刚刚释放
写锁
之后,
读卡器
线程进来,然后打印了释放
写锁
的打印语句吗

public static void main(String[] args) {

    new Thread(new Reader(), "Reader 1").start();
    new Thread(new Reader(), "Reader 2").start();
    new Thread(new WriterEven(), "Writer Even").start();
    new Thread(new WriterOdd(), "Writer Odd").start();

}

public static class Reader implements Runnable {

    public void run() {

        for (int i = 1; i <= 6; i++) {
            rwl.readLock().lock();
            // rl.lock();
            System.out.println(Thread.currentThread().getName() + "  is reading" + number);
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } finally {
                rwl.readLock().unlock();
            }
        }

    }

}

public static class WriterEven implements Runnable {

    public void run() {
        System.out.println(Thread.currentThread().getName() + " is trying  writing");
        rwl.writeLock().lock();
        System.out.println(Thread.currentThread().getName() + " got the lock");
        for (int i = 2; i <= 6; i += 2) {

            System.out.println(Thread.currentThread().getName() + " is writing");
            number = number.concat(" " + i);
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } finally {

            }

        }
        rwl.writeLock().unlock();

        System.out.println(Thread.currentThread().getName() + " left the lock");

    }

}

public static class WriterOdd implements Runnable {

    public void run() {
        System.out.println(Thread.currentThread().getName() + " is trying  writing");
        rwl.writeLock().lock();
        System.out.println(Thread.currentThread().getName() + " got the lock");
        for (int i = 1; i <= 5; i += 2) {

            System.out.println(Thread.currentThread().getName() + " is writing");
            number = number.concat(" " + i);
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } finally {

            }

        }
        rwl.writeLock().unlock();
        System.out.println(Thread.currentThread().getName() + " left the lock");

    }

}

在释放锁之后,写入有关释放写锁的控制台消息的代码行

rwl.writeLock().unlock();
// here readers can read already
// because they are free to aquire lock
System.out.println(Thread.currentThread().getName() + " left the lock");

旁白:在最后一个街区解锁。
rwl.writeLock().unlock();
// here readers can read already
// because they are free to aquire lock
System.out.println(Thread.currentThread().getName() + " left the lock");