Java 读写锁 ReadWriteLock 实战

超、凢脫俗 2021-07-24 13:36 508阅读 0赞

一 点睛

ReadWriteLock 中的读锁是共享锁,写锁是排他锁,共享锁允许不同线程同时读,排他锁只允许一个线程写,其他线程等待。

二 代码

  1. import java.util.Random;
  2. import java.util.concurrent.atomic.LongAdder;
  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. public class T10_TestReadWriteLock {
  8. static Lock lock = new ReentrantLock();
  9. private static int value;
  10. static ReadWriteLock readWriteLock = new ReentrantReadWriteLock();
  11. // 读锁
  12. static Lock readLock = readWriteLock.readLock();
  13. // 写锁
  14. static Lock writeLock = readWriteLock.writeLock();
  15. // 模拟读取操作
  16. public static void read(Lock lock) {
  17. try {
  18. lock.lock();
  19. Thread.sleep(1000);
  20. System.out.println("read over!");
  21. } catch (InterruptedException e) {
  22. e.printStackTrace();
  23. } finally {
  24. // 一定要解锁
  25. lock.unlock();
  26. }
  27. }
  28. // 模拟写操作
  29. public static void write(Lock lock, int v) {
  30. try {
  31. lock.lock();
  32. Thread.sleep(1000);
  33. value = v;
  34. System.out.println("write over!");
  35. } catch (InterruptedException e) {
  36. e.printStackTrace();
  37. } finally {
  38. lock.unlock();
  39. }
  40. }
  41. public static void main(String[] args) {
  42. //Runnable readR = ()-> read(lock);
  43. // 读时,传读锁
  44. Runnable readR = () -> read(readLock);
  45. //Runnable writeR = ()->write(lock, new Random().nextInt());
  46. // 写时,传写锁
  47. Runnable writeR = () -> write(writeLock, new Random().nextInt());
  48. for (int i = 0; i < 18; i++) new Thread(readR).start();
  49. for (int i = 0; i < 2; i++) new Thread(writeR).start();
  50. }
  51. }

三 测试

1 使用 ReentrantLock 要用 20 秒。读用了 18 秒,写用了 2 秒。

read over!

read over!

read over!

read over!

read over!

read over!

read over!

read over!

read over!

read over!

read over!

read over!

read over!

read over!

read over!

read over!

read over!

read over!

write over!

write over!

2 使用 ReentrantReadWriteLock 只要 3 秒。读用了 1 秒,写用了 2 秒。

read over!

read over!

read over!

read over!

read over!

read over!

read over!

read over!

read over!

read over!

read over!

read over!

read over!

read over!

read over!

read over!

read over!

read over!

write over!

write over!

发表评论

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

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

相关阅读

    相关 ReadWriteLock

    现实中有这样一种场景:对共享资源有读和写的操作,且写操作没有读操作那么频繁。在没有写操作的时候,多个线程同时读一个资源没有任何问题,所以应该允许多个线程同时读取共享资源;但是如

    相关 ReadWriteLock

           隐式锁Synchronized、重入锁ReetrantLock都是互斥锁、独占锁,即同一个锁只能每时每刻至多由一个线程来获持有。互斥,是一种保守策略,虽然避免了“

    相关 ReadWriteLock

    首先对于一个技术,存在就是为了解决某些技术难点。 为什么已经有ReentLock锁,却还要引入读写锁呢? 答案就是为了解决在 读多写少的场景下的性能问题,运用读写锁,能提高