首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >演示ReadWriteLock用法的示例

演示ReadWriteLock用法的示例
EN

Stack Overflow用户
提问于 2019-01-27 17:54:39
回答 1查看 57关注 0票数 1

我正在尝试理解ReadWriteLock的概念,并实现了下面的简单示例。据我所知,只要一个线程有一个readlock,另一个线程就可以获得这个readlock。但是对于具有writelock的线程,在其他线程释放锁之前,没有其他线程可以获取write/read lock。但是,从下面程序的输出中,我注意到在WriterOdd释放锁(打印释放锁的输出)之前,Reader线程进入并读取number字符串。是不是因为在释放writelock之后,reader线程会进来,然后打印释放writelock的打印语句?

代码语言:javascript
复制
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");

    }

}

输出:

代码语言:javascript
复制
Reader 2  is reading0
Reader 1  is reading0
Writer Even is trying  writing
Writer Odd is trying  writing
Writer Even got the lock
Writer Even is writing
Writer Even is writing
Writer Even is writing
Writer Odd got the lock
Writer Odd is writing
Writer Even left the lock
Writer Odd is writing
Writer Odd is writing
Reader 1  is reading0 2 4 6 1 3 5
Reader 2  is reading0 2 4 6 1 3 5
Writer Odd left the lock
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-01-27 18:08:59

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

代码语言:javascript
复制
rwl.writeLock().unlock();
// here readers can read already
// because they are free to aquire lock
System.out.println(Thread.currentThread().getName() + " left the lock");
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54386883

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档