Java 并发编程ReadWriteLock

偏执的太偏执、 2023-10-07 08:29 54阅读 0赞

一、ReadWriteLock

ReadWriteLock 有一个实现类 ReentrantReadWriteLock 可以用来创建读写锁。在学习之前可以先学习一下
ReentrantLock。

ReadWriteLock特性:

  • 支持公平锁与非公平锁;
  • 可重入;
  • 支持锁降级(写锁 -> 读锁),写锁降级成读锁,并不会自动释放当前线程获取的写锁,仍然需要显示的释放,否则别的线程永远也获取不到写锁;
  • 读写锁之间是互斥关系;
  • 写锁与写锁之间是互斥关系;
  • 读锁与读锁之间可以同时进行。

二、是例

  1. public class Test {
  2. public static void main(String[] args) throws Exception {
  3. ReadWriteLock readWriteLock = new ReentrantReadWriteLock();
  4. Lock writeLock = readWriteLock.writeLock();
  5. Lock readLock = readWriteLock.readLock();
  6. Runnable runnable1 = new Runnable() {
  7. @Override
  8. public void run() {
  9. writeLock.lock();
  10. System.out.println(Thread.currentThread().getName() + "开始写入数据....");
  11. try {
  12. Thread.sleep(1000);
  13. } catch (InterruptedException e) {
  14. e.printStackTrace();
  15. }
  16. System.out.println(Thread.currentThread().getName() + "写入完成!");
  17. writeLock.unlock();
  18. }
  19. };
  20. Runnable runnable2 = new Runnable() {
  21. @Override
  22. public void run() {
  23. readLock.lock();
  24. System.out.println(Thread.currentThread().getName() + "开始读取数据。。。");
  25. try {
  26. Thread.sleep(1000);
  27. } catch (InterruptedException e) {
  28. e.printStackTrace();
  29. }
  30. System.out.println(Thread.currentThread().getName() + "读取数据完成");
  31. readLock.unlock();
  32. }
  33. };
  34. Thread thread1 = new Thread(runnable1);
  35. Thread thread2 = new Thread(runnable2);
  36. thread2.start();
  37. thread1.start();
  38. }
  39. }

发表评论

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

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

相关阅读

    相关 并发编程系列 - ReadWriteLock

    实际工作中,为了优化性能,我们经常会使用缓存,例如缓存元数据、缓存基础数据等,这就是一种典型的读多写少应用场景。缓存之所以能提升性能,一个重要的条件就是缓存的数据一定是读多写少