悲观锁

image.png

  • 不支持并发

    乐观锁

    image.png

  • 通过版本号来控制,支持并发

    表锁

    不会发生死锁

    行锁

    会发生死锁

    读锁

    也叫共享锁,会发生死锁

    写锁

    也叫独占锁,会发生死锁

读写锁ReentrantReadWriteLock

  1. package com.daijunyi.lock;
  2. import java.util.HashMap;
  3. import java.util.Random;
  4. import java.util.concurrent.TimeUnit;
  5. import java.util.concurrent.locks.ReentrantReadWriteLock;
  6. class Cache{
  7. private volatile HashMap<String,Object> map = new HashMap<>();
  8. //读写锁
  9. private ReentrantReadWriteLock rwLock = new ReentrantReadWriteLock();
  10. public void put(String key,String value){
  11. rwLock.writeLock().lock();
  12. try {
  13. System.out.println(Thread.currentThread().getName()+"开始做存储操作");
  14. TimeUnit.SECONDS.sleep(new Random().nextInt(5));
  15. map.put(key,value);
  16. System.out.println(Thread.currentThread().getName()+"+++存储完成");
  17. } catch (InterruptedException e) {
  18. e.printStackTrace();
  19. }finally {
  20. rwLock.writeLock().unlock();
  21. }
  22. }
  23. public Object get(String key){
  24. rwLock.readLock().lock();
  25. Object value = null;
  26. try {
  27. System.out.println(Thread.currentThread().getName()+"---读操作");
  28. TimeUnit.SECONDS.sleep(new Random().nextInt(4));
  29. value = map.get(key);
  30. System.out.println(Thread.currentThread().getName()+"读操作完成");
  31. } catch (InterruptedException e) {
  32. e.printStackTrace();
  33. } finally {
  34. rwLock.readLock().unlock();
  35. }
  36. return value;
  37. }
  38. }
  39. //读写锁
  40. public class ReadWriteDemo {
  41. public static void main(String[] args) {
  42. Cache cache = new Cache();
  43. //写操作
  44. for (int i=0;i<4;i++){
  45. final String num = String.valueOf(i);
  46. new Thread(()->{
  47. cache.put(num,num);
  48. },num).start();
  49. }
  50. //读操作
  51. for (int i=0;i<4;i++){
  52. final String num = String.valueOf(i);
  53. new Thread(()->{
  54. Object o = cache.get(num);
  55. System.out.println("读操作"+o);
  56. },num).start();
  57. }
  58. }
  59. }

运行结果

  1. /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.ReadWriteDemo
  2. 0开始做存储操作
  3. 0+++存储完成
  4. 1开始做存储操作
  5. 1+++存储完成
  6. 2开始做存储操作
  7. 2+++存储完成
  8. 3开始做存储操作
  9. 3+++存储完成
  10. 0---读操作
  11. 1---读操作
  12. 2---读操作
  13. 3---读操作
  14. 2读操作完成
  15. 读操作2
  16. 3读操作完成
  17. 读操作3
  18. 0读操作完成
  19. 读操作0
  20. 1读操作完成
  21. 读操作1
  22. Process finished with exit code 0