ReadWriteLock读写锁

suaxi
2021-02-14 / 0 评论 / 88 阅读 / 正在检测是否收录...

读写锁

ReadWriteLock读写锁,一个用于只读操作,一个用于写入

package com.sw.readWriteLock;

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

/**
 * @Author suaxi
 * @Date 2021/2/14 0:10
 * ReadWriteLock 读写锁
 * 独占锁(写) 一次只能被一个线程占有
 * 共享锁(读) 可以被多个线程同时占有
 * 读-读 可以共存
 * 读-写 不能共存
 * 写-写 不能共存
 */
public class ReadWriteLockTest {
    public static void main(String[] args) {
        MyCacheLock myCache = new MyCacheLock();
        for (int i = 1; i <= 5 ; i++) {
            final int temp = i;
            new Thread(() ->{
                myCache.put(temp+"",temp+"");
            },String.valueOf(i)).start();
        }

        for (int i = 1; i <= 5 ; i++) {
            final int temp = i;
            new Thread(() ->{
                myCache.get(temp+"");
            },String.valueOf(i)).start();
        }
    }
}

class MyCacheLock{
    private volatile Map<String,Object> map = new HashMap<>();
    //相比于之前的lock锁,此处对线程的控制更加细粒度
    private ReadWriteLock readWriteLock = new ReentrantReadWriteLock();

    //存  写
    public void put(String key,Object value){
        try {
            readWriteLock.writeLock().lock();
            System.out.println(Thread.currentThread().getName()+"写入---"+key);
            map.put(key, value);
            System.out.println(Thread.currentThread().getName()+"写入完成");
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            readWriteLock.writeLock().unlock();
        }
    }

    //取  读
    public void get(String key){
        try {
            readWriteLock.readLock().lock();
            System.out.println(Thread.currentThread().getName()+"读取---"+key);
            map.get(key);
            System.out.println(Thread.currentThread().getName()+"读取完成");
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            readWriteLock.readLock().unlock();
        }

    }
}

class MyCache{
    private volatile Map<String,Object> map = new HashMap<>();

    //存  写
    public void put(String key,Object value){
        System.out.println(Thread.currentThread().getName()+"写入---"+key);
        map.put(key, value);
        System.out.println(Thread.currentThread().getName()+"写入完成");
    }

    //取  读
    public void get(String key){
        System.out.println(Thread.currentThread().getName()+"读取---"+key);
        map.get(key);
        System.out.println(Thread.currentThread().getName()+"读取完成");
    }
}

未使用读写锁之前,存在线程占用的问题:

1.未使用读写锁,写入时占用.png


使用读写锁之后,执行顺序为:A写入--->A写入完成,B写入--->B写入完成,依次进行

2.使用读写锁.png

0

评论 (0)

取消