多线程__显示锁

显示锁

Lock是显示锁的顶级接口
显示锁是指显示声明的锁,显示锁可以显示的声明和释放,使用起来比较灵活,并且提供了超时、尝试拿锁、中断等方法。
锁的选择:Java对内置锁synchronize的优化一直在持续,并且synchronize是Java中的关键字,相对于显示锁来说,至少要少声明一个对象,所以内置锁比显示锁要更节省对资源的消耗。如果不需要使用显示锁中的超时、中断等特殊的方法时,优先选择内置锁synchronize。

显示锁的常用方法

lock() 拿锁
unlock() 释放锁
trylock() 尝试拿锁,超时机制
lockinterruptybly() 中断机制

		lock.lock();
        try{
		//释放锁的操作一定要放在finally中,防止出现异常导致锁无法被释放
        }finally {
          lock.unlock();
        }

锁的公平和非公平

如果多个线程同时去抢同一把锁,拿到锁的顺序一定是线程请求的顺序,就是公平锁,如果锁是被无序发放的就是非公平锁。
非公平锁的效率更高,因为唤醒线程需要进行上下文切换,一次上下文切换需要5000-10000个CPU周期,如果是公平锁的话,每个线程都需要经过这个过程,非公平锁可以利用上下文切换的时间去进行一些操作,充分利用CPU资源。

可重入锁

ReentrantLock是典型的显示锁之一,ReentrantLock基本可以代替synchronize关键字。可重入锁的含义就是,拿到锁之后当前线程可以重复进入(例如递归调用),不会出现自己把自己锁死的情况(ReentrantLock 默认为非公平锁)。

读写锁

当读的频率远远大于写的频率时,每次读取都不会对数据的完整性造成破坏,这时如果使用传统锁,那么每次读取都需要进行获取和释放锁,会大大降低系统的效率。
ReadWriteLock是一个读写分离锁,这是一个接口,实现类是ReentReadWriteLock,可以通过getReadLock()和getWriteLock分别获取读锁和写锁。读写锁可以根据情况来进行锁的获取和释放。读锁之间不会互相阻塞,读锁和写锁为互斥锁。

//代码有空补上

Condition

condition是控制线程等待和释放锁,和wait(),notify()方法类似。
lock.newCondition() 获取condition
await() 等待
signal()唤醒

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值