悲观锁

读写锁ReentrantReadWriteLock
package com.daijunyi.lock;import java.util.HashMap;import java.util.Random;import java.util.concurrent.TimeUnit;import java.util.concurrent.locks.ReentrantReadWriteLock;class Cache{private volatile HashMap<String,Object> map = new HashMap<>();//读写锁private ReentrantReadWriteLock rwLock = new ReentrantReadWriteLock();public void put(String key,String value){rwLock.writeLock().lock();try {System.out.println(Thread.currentThread().getName()+"开始做存储操作");TimeUnit.SECONDS.sleep(new Random().nextInt(5));map.put(key,value);System.out.println(Thread.currentThread().getName()+"+++存储完成");} catch (InterruptedException e) {e.printStackTrace();}finally {rwLock.writeLock().unlock();}}public Object get(String key){rwLock.readLock().lock();Object value = null;try {System.out.println(Thread.currentThread().getName()+"---读操作");TimeUnit.SECONDS.sleep(new Random().nextInt(4));value = map.get(key);System.out.println(Thread.currentThread().getName()+"读操作完成");} catch (InterruptedException e) {e.printStackTrace();} finally {rwLock.readLock().unlock();}return value;}}//读写锁public class ReadWriteDemo {public static void main(String[] args) {Cache cache = new Cache();//写操作for (int i=0;i<4;i++){final String num = String.valueOf(i);new Thread(()->{cache.put(num,num);},num).start();}//读操作for (int i=0;i<4;i++){final String num = String.valueOf(i);new Thread(()->{Object o = cache.get(num);System.out.println("读操作"+o);},num).start();}}}
运行结果
/Library/Java/JavaVirtualMachines/jdk1.8.0_111.jdk/Contents/Home/bin/java -Dfile.encoding=UTF-8 -classpath /Library/Java/JavaVirtualMachines/jdk1.8.0_111.jdk/Contents/Home/jre/lib/charsets.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_111.jdk/Contents/Home/jre/lib/deploy.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_111.jdk/Contents/Home/jre/lib/ext/cldrdata.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_111.jdk/Contents/Home/jre/lib/ext/dnsns.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_111.jdk/Contents/Home/jre/lib/ext/jaccess.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_111.jdk/Contents/Home/jre/lib/ext/jfxrt.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_111.jdk/Contents/Home/jre/lib/ext/localedata.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_111.jdk/Contents/Home/jre/lib/ext/nashorn.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_111.jdk/Contents/Home/jre/lib/ext/sunec.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_111.jdk/Contents/Home/jre/lib/ext/sunjce_provider.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_111.jdk/Contents/Home/jre/lib/ext/sunpkcs11.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_111.jdk/Contents/Home/jre/lib/ext/zipfs.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_111.jdk/Contents/Home/jre/lib/javaws.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_111.jdk/Contents/Home/jre/lib/jce.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_111.jdk/Contents/Home/jre/lib/jfr.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_111.jdk/Contents/Home/jre/lib/jfxswt.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_111.jdk/Contents/Home/jre/lib/jsse.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_111.jdk/Contents/Home/jre/lib/management-agent.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_111.jdk/Contents/Home/jre/lib/plugin.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_111.jdk/Contents/Home/jre/lib/resources.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_111.jdk/Contents/Home/jre/lib/rt.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_111.jdk/Contents/Home/lib/ant-javafx.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_111.jdk/Contents/Home/lib/dt.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_111.jdk/Contents/Home/lib/javafx-mx.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_111.jdk/Contents/Home/lib/jconsole.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_111.jdk/Contents/Home/lib/packager.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_111.jdk/Contents/Home/lib/sa-jdi.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_111.jdk/Contents/Home/lib/tools.jar:/Users/djy/WorkFile/learn/juc/picker/target/classes com.daijunyi.lock.ReadWriteDemo0开始做存储操作0+++存储完成1开始做存储操作1+++存储完成2开始做存储操作2+++存储完成3开始做存储操作3+++存储完成0---读操作1---读操作2---读操作3---读操作2读操作完成读操作23读操作完成读操作30读操作完成读操作01读操作完成读操作1Process finished with exit code 0

