前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >10.ReadWriteLock 读写锁

10.ReadWriteLock 读写锁

作者头像
Devops海洋的渔夫
发布2022-03-23 16:24:22
2470
发布2022-03-23 16:24:22
举报
文章被收录于专栏:Devops专栏

10.ReadWriteLock 读写锁

读-写锁 ReadWriteLock

代码语言:javascript
复制
- ReadWriteLock 维护了一对相关的锁,一个用于只读操作,另一个用于写入操作。只要没有 writer,读取锁可以由多个 reader 线程同时保持。写入锁是独占的。。

- ReadWriteLock 读取操作通常不会改变共享资源,但执行写入操作时,必须独占方式来获取锁。对于读取操作占多数的数据结构。ReadWriteLock 能提供比独占锁更高的并发性。而对于只读的数据结构,其中包含的不变性可以完全不需要考虑加锁操作。

示例代码

1.首先编写一个读写锁的示例

代码语言:javascript
复制
class ReadWriteLockDemo{

    //成员属性
    private int number = 0; // 定义一个用于读写的值
    //创建读写锁
    private ReadWriteLock lock = new ReentrantReadWriteLock();

    //读:设置读锁
    public void get(){
        lock.readLock().lock(); //设置读锁

        try{
            System.out.println(Thread.currentThread().getName() + " : " + number + " ,当前时间: " + System.currentTimeMillis());
        }finally{
            lock.readLock().unlock(); //释放读锁
        }
    }

    //写:设置写入锁
    public void set(int number){
        lock.writeLock().lock(); // 设置写入锁

        try{
            System.out.println(Thread.currentThread().getName());
            this.number = number; // 设置值
        }finally{
            lock.writeLock().unlock(); // 释放写锁
        }
    }
}

2.创建一个写入的线程 和 100个读取的线程

代码语言:javascript
复制
public class TestReadWriteLock {
    public static void main(String[] args) {
        //1.创建读写锁示例对象
        ReadWriteLockDemo rw = new ReadWriteLockDemo();
        //2.创建一个写入锁线程
        new Thread(new Runnable() {

            @Override
            public void run() {
                rw.set((int)(Math.random() * 101)); // 随机设置值
            }
        }, "Write:").start();

        //2.创建100个读线程,查看读取的值是否一致
        for (int i = 0; i < 100; i++) {
            new Thread(new Runnable() {

                @Override
                public void run() {
                    rw.get();
                }
            }).start();
        }
    }
}

测试执行如下:

image-20201104000012335

3.完整的示例代码

代码语言:javascript
复制
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;

/**
 * 1. ReadWriteLock : 读写锁
 *
 * 写写/读写 需要“互斥”
 * 读读 不需要互斥
 *
 * @author Aron.li
 * @date 2020/11/3 23:52
 */
public class TestReadWriteLock {
    public static void main(String[] args) {
        //1.创建读写锁示例对象
        ReadWriteLockDemo rw = new ReadWriteLockDemo();
        //2.创建一个写入锁线程
        new Thread(new Runnable() {

            @Override
            public void run() {
                rw.set((int)(Math.random() * 101)); // 随机设置值
            }
        }, "Write:").start();

        //2.创建100个读线程,查看读取的值是否一致
        for (int i = 0; i < 100; i++) {
            new Thread(new Runnable() {

                @Override
                public void run() {
                    rw.get();
                }
            }).start();
        }
    }
}

class ReadWriteLockDemo{

    //成员属性
    private int number = 0; // 定义一个用于读写的值
    //创建读写锁
    private ReadWriteLock lock = new ReentrantReadWriteLock();

    //读:设置读锁
    public void get(){
        lock.readLock().lock(); //设置读锁

        try{
            System.out.println(Thread.currentThread().getName() + " : " + number + " ,当前时间: " + System.currentTimeMillis());
        }finally{
            lock.readLock().unlock(); //释放读锁
        }
    }

    //写:设置写入锁
    public void set(int number){
        lock.writeLock().lock(); // 设置写入锁

        try{
            System.out.println(Thread.currentThread().getName());
            this.number = number; // 设置值
        }finally{
            lock.writeLock().unlock(); // 释放写锁
        }
    }
}
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-03-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 海洋的渔夫 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 10.ReadWriteLock 读写锁
    • 读-写锁 ReadWriteLock
      • 示例代码
        • 1.首先编写一个读写锁的示例
        • 2.创建一个写入的线程 和 100个读取的线程
        • 3.完整的示例代码
    相关产品与服务
    腾讯云服务器利旧
    云服务器(Cloud Virtual Machine,CVM)提供安全可靠的弹性计算服务。 您可以实时扩展或缩减计算资源,适应变化的业务需求,并只需按实际使用的资源计费。使用 CVM 可以极大降低您的软硬件采购成本,简化 IT 运维工作。
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档