package com.lyon.juc; import java.util.HashMap; import java.util.Map; import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReentrantReadWriteLock; //独占锁(写锁) 一次只能被一个线程占用 //共享锁(读锁)多个线程可以同时占有 /https://blog.youkuaiyun.com/yanyan19880509/article/details/52435135 这边博文讲解的非常详细!!!
//读写锁 public class ReadWriteLockDemo { public static void main(String[] args) { //MyCache myCache = new MyCache(); MyCacheLock myCacheLock = new MyCacheLock(); for (int i = 0; i < 5; i++) { int temp = i; new Thread(()->{ //myCache.put(temp +"", temp +""); myCacheLock.put(temp +"", temp +""); },String.valueOf(i)).start(); } //读取 for (int i = 0; i < 5; i++) { int temp = i; new Thread(()->{ //myCache.get(temp +""); myCacheLock.get(temp +""); },String.valueOf(i)).start(); } } } //加锁 自定义缓存 class MyCacheLock{ private volatile Map<String,Object> map = new HashMap<>(); //读写锁 private ReadWriteLock readWriteLockwriteLock= new ReentrantReadWriteLock(); //存,写 写入的时候,同一时刻只希望一个线程执行 public void put(String key ,Object value){ readWriteLockwriteLock.writeLock().lock(); try{ System.out.println(Thread.currentThread().getName()+"写入"+key); map.put(key,value); System.out.println(Thread.currentThread().getName()+"写入"+key+"ok"); }catch (Exception e){ e.printStackTrace(); }finally { readWriteLockwriteLock.writeLock().unlock(); } } //取,读 所有人都可以读 public void get(String key){ readWriteLockwriteLock.readLock().lock(); try{ System.out.println(Thread.currentThread().getName()+"读取"+key); Object value = map.get(key); System.out.println(Thread.currentThread().getName()+"读取"+key+"ok"); }catch (Exception e){ e.printStackTrace(); }finally { readWriteLockwriteLock.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()+"写入"+key+"ok"); } //取,读 public void get(String key){ System.out.println(Thread.currentThread().getName()+"读取"+key); Object value = map.get(key); System.out.println(Thread.currentThread().getName()+"读取"+key+"ok"); } }
多线程之读写锁(独占、共享锁)
最新推荐文章于 2022-07-23 17:20:25 发布