读写锁 ReentrantReadWriteLock

深碍√TFBOYSˉ_ 2022-06-10 04:23 384阅读 0赞

读操作的时候 所有的线程可以一起执行. 上读锁,其他线程只能读不能写

写操作的时候 会锁定一个线程. 上写锁,不允许其他线程读也不允许写

自定义的map

  1. import java.util.ArrayList;
  2. import java.util.HashMap;
  3. import java.util.List;
  4. public class LockMap<K, V> extends ILock
  5. {
  6. private HashMap<K, V> map = new HashMap<K, V>();
  7. public HashMap<K, V> getMap()
  8. {
  9. HashMap<K, V> map = new HashMap<K, V>();
  10. ReadLock().lock();
  11. try
  12. {
  13. map.putAll(map);
  14. }
  15. catch(Exception e)
  16. {
  17. e.printStackTrace();
  18. }
  19. finally
  20. {
  21. ReadLock().unlock();
  22. }
  23. return map;
  24. }
  25. public List<K> getKeys()
  26. {
  27. ReadLock().lock();
  28. try
  29. {
  30. return new ArrayList<K>(map.keySet());
  31. }
  32. catch(Exception e)
  33. {
  34. e.printStackTrace();
  35. }
  36. finally
  37. {
  38. ReadLock().unlock();
  39. }
  40. return null;
  41. }
  42. public List<V> getValues()
  43. {
  44. ReadLock().lock();
  45. try
  46. {
  47. return new ArrayList<V>(map.values());
  48. }
  49. catch(Exception e)
  50. {
  51. e.printStackTrace();
  52. }
  53. finally
  54. {
  55. ReadLock().unlock();
  56. }
  57. return null;
  58. }
  59. public V get(K key)
  60. {
  61. ReadLock().lock();
  62. try
  63. {
  64. if(map.containsKey(key))
  65. {
  66. return map.get(key);
  67. }
  68. }
  69. catch(Exception e)
  70. {
  71. e.printStackTrace();
  72. }
  73. finally
  74. {
  75. ReadLock().unlock();
  76. }
  77. return null;
  78. }
  79. public int size()
  80. {
  81. ReadLock().lock();
  82. try
  83. {
  84. return map.size();
  85. }
  86. catch(Exception e)
  87. {
  88. e.printStackTrace();
  89. }
  90. finally
  91. {
  92. ReadLock().unlock();
  93. }
  94. return 0;
  95. }
  96. public void clear()
  97. {
  98. WriteLock().lock();
  99. try
  100. {
  101. map.clear();
  102. }
  103. catch(Exception e)
  104. {
  105. e.printStackTrace();
  106. }
  107. finally
  108. {
  109. WriteLock().unlock();
  110. }
  111. }
  112. public void put(K key, V value)
  113. {
  114. WriteLock().lock();
  115. try
  116. {
  117. map.put(key, value);
  118. }
  119. catch(Exception e)
  120. {
  121. e.printStackTrace();
  122. }
  123. finally
  124. {
  125. WriteLock().unlock();
  126. }
  127. }
  128. public void remove(K key)
  129. {
  130. WriteLock().lock();
  131. try
  132. {
  133. if(map.containsKey(key))
  134. {
  135. map.remove(key);
  136. }
  137. }
  138. catch(Exception e)
  139. {
  140. e.printStackTrace();
  141. }
  142. finally
  143. {
  144. WriteLock().unlock();
  145. }
  146. }
  147. }

ILock

  1. import java.util.concurrent.locks.Lock;
  2. import java.util.concurrent.locks.ReadWriteLock;
  3. import java.util.concurrent.locks.ReentrantReadWriteLock;
  4. public abstract class ILock
  5. {
  6. private ReadWriteLock meadWriteLock = new ReentrantReadWriteLock();
  7. protected final Lock ReadLock()
  8. {
  9. return meadWriteLock.readLock();
  10. }
  11. protected final Lock WriteLock()
  12. {
  13. return meadWriteLock.writeLock();
  14. }
  15. }

发表评论

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

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

相关阅读

    相关 ReentrantReadWriteLock

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