多线程__显示锁

显示锁

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()唤醒

猜你喜欢

转载自blog.csdn.net/qq_38438909/article/details/105500745