java多线程 -- ReadWriteLock 读写锁-阿里云开发者社区

开发者社区> 西北野狼> 正文

java多线程 -- ReadWriteLock 读写锁

简介: 写一条线程,读多条线程能够提升效率。 写写/读写 需要“互斥”;读读 不需要互斥. ReadWriteLock 维护了一对相关的锁,一个用于只读操作,另一个用于写入操作。只要没有 writer,读取锁可以由多个 reader 线程同时保持。
+关注继续查看

写一条线程,读多条线程能够提升效率。

写写/读写 需要“互斥”;
读读 不需要互斥.

  1. ReadWriteLock 维护了一对相关的锁,一个用于只读操作,另一个用于写入操作。只要没有 writer,读取锁可以由多个 reader 线程同时保持。写入锁是独占的。
  2. ReadWriteLock 读取操作通常不会改变共享资源,但执行写入操作时,必须独占方式来获取锁。对于读取操作占多数的数据结构。 ReadWriteLock 能提供比独占锁更高的并发性。而对于只读的数据结构,其中包含的不变性可以完全不需要考虑加锁操作。

api相关方法:

  1. Lock readLock()返回用于读取操作的锁。
  2. Lock writeLock()返回用于写入操作的锁。

 demo:

package com.company;

import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;

/*
 * 1. ReadWriteLock : 读写锁
 * 
 * 写写/读写 需要“互斥”
 * 读读 不需要互斥
 * 
 */
public class TestReadWriteLock {

    public static void main(String[] args) {
        ReadWriteLockDemo rw = new ReadWriteLockDemo();

        new Thread(() -> rw.set(new ReadWriteLockDemo.Person("soyoungboy", 27)), "Write:").start();


        for (int i = 0; i < 10; i++) {
            new Thread(() -> rw.get()).start();
        }
    }

}

class ReadWriteLockDemo {

    private Person person;

    private ReadWriteLock lock = new ReentrantReadWriteLock();

    //
    void get() {
        lock.readLock().lock(); //上锁

        try {
            if (person != null) {
                System.out.println(Thread.currentThread().getName() + " ==> person : " + person.toString());
            }else {
                System.out.println(Thread.currentThread().getName() + "");
            }
        } finally {
            lock.readLock().unlock(); //释放锁
        }
    }

    //
    void set(Person person) {
        lock.writeLock().lock();

        try {
            System.out.println(Thread.currentThread().getName());
            this.person = person;
        } finally {
            lock.writeLock().unlock();
        }
    }

    static class Person {

        private String name;
        private int age;

        public Person(String name, int age) {
            this.name = name;
            this.age = age;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public int getAge() {
            return age;
        }

        public void setAge(int age) {
            this.age = age;
        }

        @Override
        public String toString() {
            return "Person{" +
                    "name='" + name + '\'' +
                    ", age=" + age +
                    '}';
        }

    }
}

结果:

Thread-0
Thread-1
Thread-3
Thread-2
Write:
Thread-4 ==> person : Person{name='soyoungboy', age=27}
Thread-6 ==> person : Person{name='soyoungboy', age=27}
Thread-8 ==> person : Person{name='soyoungboy', age=27}
Thread-5 ==> person : Person{name='soyoungboy', age=27}
Thread-7 ==> person : Person{name='soyoungboy', age=27}
Thread-9 ==> person : Person{name='soyoungboy', age=27}

 

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Java多线程高并发学习笔记(二)——深入理解ReentrantLock与Condition
锁的概念 从jdk发行1.5版本之后,在原来synchronize的基础上,增加了重入锁ReentrantLock。 本文就不介绍synchronize了,有兴趣的同学可以去了解一下,本文重点介绍ReentrantLock。
1072 0
java多线程 -- CountDownLatch 闭锁
CountDownLatch 一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。 用给定的计数 初始化 CountDownLatch。由于调用了 countDown() 方法,所以在当前计数到达零之前,await 方法会一直受阻塞。
763 0
多线程编程学习四(Lock 的使用)
一、前言     本文要介绍使用Java5中 Lock 对象,同样也能实现同步的效果,而且在使用上更加方便、灵活,主要包括 ReentrantLock 类的使用和ReentrantReadWriteLock 类的使用。
813 0
浅析多线程的对象锁和Class锁
一、前言 本来想在另外一篇文章说的,发现可能篇幅有点大,所以还是另开一篇博文来说好了。知识参考《Java多线程编程核心技术》,评价下这本书吧——大量的代码,简单的说明,真像在看博客。不过这本书浅显易懂,篇幅也不长,一口气看个几十页,再照着demo敲敲代码,简直不要太爽。
671 0
如何让您的php也支持pthreads多线程
  我们常常会碰到这样一种情况,开发环境在windows下开发,而生产环境确是linux。windows下能正常运行,上传到linux后却无法好好地玩耍了。然后开始了一轮尼玛式的疯狂的查找原因,最后发现是服务器环境问题。
1075 0
Java多线程编程:变量共享分析(Thread)
在编写多线程程序时,最重要的就是搞清楚哪些变量是共享的,哪些变量是不共享的。也就是要分析清楚其中的原理呀。 因为最近要使用多线程就看了一些,对使用Thread类的子类创建线程的情况,总结如下: 1.方法体内部定义的局部变量不共享    这是因为方法内部定义的变量是在运行时动态生成的。
936 0
+关注
西北野狼
擅长Android ,J2EE开发 博客园地址:http://www.cnblogs.com/androidsuperman/p/7834762.html github地址: https://github.com/soyoungboy
463
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载