Java并发(十一),java基础类型和包装类型

    • tryRelease

概述


ReentrantLock和Mutex都是一个排他锁,也就是说,同一时刻只有一个线程可以去获取这把锁

但读写锁并不完全是排他锁,同一时刻是允许多个读线程来进行访问的,读写锁实际上指的是一对锁,读锁和写锁

读锁可以被共享,但只要写锁被获取了,那么读锁和写锁都将被阻塞。

读写锁不仅可以保证写操作对读操作的可见性外,还可以简化读写交互场景,比如对于一个缓存的结构来说,缓存一般是以读服务为主,读写锁可以保证,写操作对于后续的读操作是可见的(因为写的时候不允许读,只要写完才可以读)

读写锁是在Java5之后才拥有的,在没有读写锁之前,Java采用的是等待通知机制来实现上面的操作的,即写操作对于后续的读操作是可见的,具体是当写操作开始的时候,所有晚于该写操作的读操作均会进入等待状态,只有等写操作完成并进行通知之后,所有正在等待的读操作才能继续进行,而对于写操作而言,写操作之间是使用Synchronized来进行同步的,保证了只能写操作之间是互斥的,使得读操作可以读取到正确得数据,不会出现脏读

读写锁其实也就是针对上面的场景得出的,因为使用Synchronized为重量级锁,效率会比较慢,最重要的是采用等待通知机制去让读操作进入等待状态会比较麻烦,改用读写锁去实现的话,只需要在读操作时获取读锁,写操作时获取写锁即可,当写锁被获取到时,后续的读写操作都会被阻塞,等写锁释放了之后,后续所有的读写操作才能继续进行

ReentrantReadWriteLock


特性

  • ReentrantReadWriteLock支持非公平和公平的获取锁方式,吞吐量依然是非公平优于公平,并且默认的方式是非公平

  • ReentrantReadWriteLock支持可重入,当读线程获取了读锁之后,其能继续去获得读锁;当写线程获得了写锁之后,其能继续去获得写锁,也能去获得读锁(写线程能自己读,但其他线程不能读,也不能写)

  • 支持锁降级,当获取了写锁、再获取读锁,之后释放了写锁之后,会自动降级为读锁

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值