1.读写锁:一个资源可以被多个读线程访问,或者可以被一个写线程访问,但是不能同时存在读写线程,读写互斥,读读共享的。
代码如下:
class MyCache { private volatile Map<String,Object> map = new HashMap<>(); private ReentrantReadWriteLock rwLock = new ReentrantReadWriteLock(); //放数据 public void put(String key, Object value) { try { rwLock.writeLock().lock(); System.out.println(Thread.currentThread().getName() +" 正在写操作" + key); TimeUnit.MICROSECONDS.sleep(300); map.put(key,value); System.out.println(Thread.currentThread().getName() +" 写完了" + key); } catch (InterruptedException e) { e.printStackTrace(); } finally { rwLock.writeLock().unlock(); } } //取数据 public Object get(String key) { Object result = null; try { rwLock.readLock().lock(); System.out.println(Thread.currentThread().getName() +" 正在读取操作" + key); TimeUnit.MICROSECONDS.sleep(300); result = map.get(key); System.out.println(Thread.currentThread().getName() +" 取完了" + key); } catch (InterruptedException e) { e.printStackTrace(); } finally { rwLock.readLock().unlock(); } return result; } } public class ReadWriteLockDemo { public static void main(String[] args) throws InterruptedException { MyCache myCache = new MyCache(); //创建线程放数据 for(int i = 0; i <= 5; i++) { final int num = i; new Thread(() -> { myCache.put(num +"",num +""); },String.valueOf(i)).start(); } //创建线程读数据 for(int i = 0; i <= 5; i++) { final int num = i; new Thread(() -> { myCache.get(num +""); },String.valueOf(i)).start(); } } }
结果如下:
代码如下:
public class ReadWriteLockDemo1 { public static void main(String[ ]args) { ReentrantReadWriteLock rwLock = new ReentrantReadWriteLock(); ReentrantReadWriteLock.ReadLock readLock = rwLock.readLock(); ReentrantReadWriteLock.WriteLock writeLock = rwLock.writeLock(); //锁降级 writeLock.lock(); System.out.println("---开始write操作"); readLock.lock(); System.out.println("---开始read操作"); writeLock.unlock(); System.out.println("---write操作完成"); readLock.unlock(); System.out.println("---read操作完成"); } }
正常结果如下:
异常代码如下:
public class ReadWriteLockDemo1 { public static void main(String[ ]args) { ReentrantReadWriteLock rwLock = new ReentrantReadWriteLock(); ReentrantReadWriteLock.ReadLock readLock = rwLock.readLock(); ReentrantReadWriteLock.WriteLock writeLock = rwLock.writeLock(); //锁降级 readLock.lock(); System.out.println("---开始read操作"); writeLock.lock(); System.out.println("---开始write操作"); // writeLock.unlock(); // System.out.println("---write操作完成"); // // readLock.unlock(); // System.out.println("---read操作完成"); } }
结果如下:会一直阻塞。
原文:https://www.cnblogs.com/liuyi13535496566/p/15028332.html