天天看点

6、ReentrantReadWriteLock, 读写锁(手写 一个缓存)

多线程: 线程操作资源类

* 缓存分三个方法

*      1:读

*      2:写

*      3:清缓存

*      用 ReentrantReadWriteLock 解决, 可重入的读写锁,提高并发效率

package com.example.study01.common.LockDemo;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
/**
 * 多线程: 线程操作资源类
 * 缓存分三个方法
 *      1:读
 *      2:写
 *      3:清缓存
 * 用 ReentrantReadWriteLock 解决, 可重入的读写锁,提高并发效率
 */
class MyCache {
    private volatile Map<String, Object> map = new HashMap<>();
    // 读写锁,读写分离
    private ReadWriteLock lock = new ReentrantReadWriteLock();
    /**
     * 写
     * @param key
     * @param value
     */
    public void put(String key, Object value){
        lock.writeLock().lock();
        try {
            System.out.println(Thread.currentThread().getName()+" 正在写入:" + key);
            map.put(key, value);
            TimeUnit.MILLISECONDS.sleep(300);
            System.out.println(Thread.currentThread().getName()+" 写入完成");
        } catch (Exception e){
            e.printStackTrace();
        } finally {
            lock.writeLock().unlock();
        }
    }
    /**
     * 读
     * @param key
     * @param value
     */
    public void get(String key, Object value){
        lock.readLock().lock();
        try {
            System.out.println(Thread.currentThread().getName()+" 正在读取:" + key);
            map.put(key, value);
            TimeUnit.MILLISECONDS.sleep(300);
            System.out.println(Thread.currentThread().getName()+" 读取完成");
        } catch (Exception e){
            e.printStackTrace();
        } finally {
            lock.readLock().unlock();
        }
    }
    /**
     * 清空
     */
    public void clear() {
        map.clear();
    }
}
/**
 * 共享锁
 */
public class ReentrantReadWriteLockDemo {
    public static void main(String[] args) {
        MyCache cache = new MyCache();
        for (int i = 0; i < 5; i++) {
            final int ii = i;
            new Thread(() -> {
                cache.put(ii+"", ii+"1");
            },"t"+i).start();
        }
        for (int i = 0; i < 5; i++) {
            final int ii = i;
            new Thread(() -> {
                cache.get(ii+"", ii+"1");
            },"t"+i).start();
        }
        cache.clear();
    }
}
           

继续阅读