10.ReadWriteLock 读写锁

2022-03-23 16:24:22 浏览数 (1)

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

0 人点赞