特点:读的时候可以让多个线程读,写的时候只能让一个线程写。

    1. import java.util.HashMap;
    2. import java.util.Map;
    3. import java.util.concurrent.locks.Lock;
    4. import java.util.concurrent.locks.ReadWriteLock;
    5. import java.util.concurrent.locks.ReentrantLock;
    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. MyCache myCache = new MyCache();
    18. // 写入
    19. for (int i = 1; i <= 5 ; i++) {
    20. final int temp = i;
    21. new Thread(()->{
    22. myCache.put(temp+"",temp+"");
    23. },String.valueOf(i)).start();
    24. }
    25. // 读取
    26. for (int i = 1; i <= 5 ; i++) {
    27. final int temp = i;
    28. new Thread(()->{
    29. myCache.get(temp+"");
    30. },String.valueOf(i)).start();
    31. }
    32. }
    33. }
    34. // 加锁的
    35. class MyCacheLock{
    36. private volatile Map<String,Object> map = new HashMap<>();
    37. // 读写锁: 更加细粒度的控制
    38. private ReadWriteLock readWriteLock = new ReentrantReadWriteLock();
    39. private Lock lock = new ReentrantLock();
    40. // 存,写入的时候,只希望同时只有一个线程写
    41. public void put(String key,Object value){
    42. readWriteLock.writeLock().lock();
    43. try {
    44. System.out.println(Thread.currentThread().getName()+"写入"+key);
    45. map.put(key,value);
    46. System.out.println(Thread.currentThread().getName()+"写入OK");
    47. } catch (Exception e) {
    48. e.printStackTrace();
    49. } finally {
    50. readWriteLock.writeLock().unlock();
    51. }
    52. }
    53. // 取,读,所有人都可以读!
    54. public void get(String key){
    55. readWriteLock.readLock().lock();
    56. try {
    57. System.out.println(Thread.currentThread().getName()+"读取"+key);
    58. Object o = map.get(key);
    59. System.out.println(Thread.currentThread().getName()+"读取OK");
    60. } catch (Exception e) {
    61. e.printStackTrace();
    62. } finally {
    63. readWriteLock.readLock().unlock();
    64. }
    65. }
    66. }
    67. /**
    68. * 自定义缓存
    69. */
    70. class MyCache{
    71. private volatile Map<String,Object> map = new HashMap<>();
    72. // 存,写
    73. public void put(String key,Object value){
    74. System.out.println(Thread.currentThread().getName()+"写入"+key);
    75. map.put(key,value);
    76. System.out.println(Thread.currentThread().getName()+"写入OK");
    77. }
    78. // 取,读
    79. public void get(String key){
    80. System.out.println(Thread.currentThread().getName()+"读取"+key);
    81. Object o = map.get(key);
    82. System.out.println(Thread.currentThread().getName()+"读取OK");
    83. }
    84. }