JAVA 读写锁ReentrantReadWriteLock()

「爱情、让人受尽委屈。」 2024-03-24 13:32 141阅读 0赞
  1. package com.test.rw;
  2. import java.util.HashMap;
  3. import java.util.Hashtable;
  4. import java.util.Map;
  5. import java.util.concurrent.locks.ReadWriteLock;
  6. import java.util.concurrent.locks.ReentrantReadWriteLock;
  7. /*
  8. 独占锁(写锁) 一次只能被一个线程占有
  9. 共享锁(读锁) 多规格线程可以同时占有
  10. ReadWriteLock
  11. 读-读 可以共存
  12. 读-写 不能共存
  13. 写-写 不能共存
  14. */
  15. public class ReadWriteLockDemo {
  16. public static void main(String[] args) {
  17. MyCache2 myCache = new MyCache2();
  18. for (int i = 1; i <=5 ; i++) {
  19. final int temp = i;
  20. new Thread(()->{
  21. myCache.put(temp+ "",temp+ "");
  22. },String.valueOf(i)).start();
  23. }
  24. for (int i = 1; i <=5 ; i++) {
  25. final int temp = i;
  26. new Thread(()->{
  27. myCache.get(temp + "");
  28. },String.valueOf(i)).start();
  29. }
  30. }
  31. }
  32. // 加锁的
  33. class MyCache2 {
  34. private volatile Map<String,Object> map = new HashMap<>();
  35. // 读写锁 更加细粒度的控制
  36. private ReadWriteLock readWriteLock = new ReentrantReadWriteLock();
  37. // 存,写入的时候,只希望同时只有一个线程写
  38. public void put(String key,Object value){
  39. readWriteLock.writeLock().lock();
  40. try {
  41. System.out.println(Thread.currentThread().getName() + "write key :" + key);
  42. map.put(key,value);
  43. System.out.println(Thread.currentThread().getName() + "write Ok");
  44. }catch (Exception e){
  45. e.getStackTrace();
  46. }finally {
  47. readWriteLock.writeLock().unlock();
  48. }
  49. }
  50. // 取,读,所有人都可以读
  51. public void get(String key){
  52. readWriteLock.readLock().lock();
  53. try {
  54. System.out.println(Thread.currentThread().getName() + "Read key " + key);
  55. map.get(key);
  56. System.out.println(Thread.currentThread().getName() + "Read Ok");
  57. }catch (Exception e){
  58. e.getStackTrace();
  59. }finally {
  60. readWriteLock.readLock().unlock();
  61. }
  62. }
  63. }
  64. // 无锁的
  65. class MyCache {
  66. private volatile Map<String,Object> map = new HashMap<>();
  67. public void put(String key,Object value){
  68. System.out.println(Thread.currentThread().getName() + "write key :" + key);
  69. map.put(key,value);
  70. System.out.println(Thread.currentThread().getName() + "write Ok");
  71. }
  72. public void get(String key){
  73. System.out.println(Thread.currentThread().getName() + "Read key " + key);
  74. map.get(key);
  75. System.out.println(Thread.currentThread().getName() + "Read Ok");
  76. }
  77. }

发表评论

表情:
评论列表 (有 0 条评论,141人围观)

还没有评论,来说两句吧...

相关阅读

    相关 ReentrantReadWriteLock

    1. 写锁比读锁的优先级要高,拥有写锁之后还可以再获取读锁,但是拥有读锁的线程在释放前无法再获取写锁。 2. 允许锁降级,即从写锁降级为读锁,实现的步骤是:先获取写锁,再获