10.ReadWriteLock 读写锁

10.ReadWriteLock 读写锁

读-写锁 ReadWriteLock

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

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

示例代码

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

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个读取的线程

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();
        }
    }
}

测试执行如下:

10.ReadWriteLock 读写锁
image-20201104000012335

3.完整的示例代码

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(); // 释放写锁
        }
    }
}


原文始发于微信公众号(海洋的渔夫):10.ReadWriteLock 读写锁

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/34946.html

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!