在Lock接口中,获取锁的方法有4个:lock()、tryLock()、tryLock(long,TimeUnit)、lockInterruptibly(),为什么需要这么多方法?这些方法有什么区别?接下来我们一起来看看吧。lock方法lock方法是Lock接口中最基本的锁获取方法。当有可用锁时,会直接获取锁并立即返回。当没有可用的锁时,它会一直等待,直到获得锁。它的基本用法如下:Locklock=newReentrantLock();//获取锁lock.lock();try{//执行业务代码...}finally{//释放锁lock.unlock();}lockInterruptibly方法lockInterruptibly方法类似于lock方法,当有可用锁时,会直接获取锁并立即返回。如果没有可用的锁,就会一直等到获取到锁,但是和lock方法不同的是,lockInterruptibly方法在等待获取的过程中如果遇到线程中断,就会放弃获取锁。它的基本用法如下:Locklock=newReentrantLock();try{//获取锁lock.lockInterruptibly();try{//执行业务方法...}finally{//释放锁lock.unlock();}}catch(InterruptedExceptione){e.printStackTrace();}PS:使用thread.interrupt()方法中断线程执行。tryLock方法与前面两种方法不同。不带参数的tryLock方法会尝试获取锁,并立即返回获取锁的结果(true或false)。如果有可用锁,则返回true并获取锁。如果没有可用的锁将立即返回false。它的基本用法如下:Locklock=newReentrantLock();//获取锁booleanresult=lock.tryLock();if(result){try{//获取锁成功,执行业务代码...}finally{//释放锁lock.unlock();}}else{//执行获取锁失败的业务代码...}tryLock(long,TimeUnit)方法有参数tryLock(long,TimeUnit)方法需要设置两个参数,第一个参数是超时时间long类型的时间,第二个参数是参数一的时间类型说明(比如第一个参数是3,那么是3秒还是3分钟,第二个参数说了算)。如果在此时间内获取到可用锁,则返回true,如果在定义时间内未获取到锁,则返回false。它的基本用法如下:Locklock=newReentrantLock();try{//获取锁(最多等待3s,获取不到锁返回false)booleanresult=lock.tryLock(3,TimeUnit.SECONDS);if(result){try{//成功获取锁,执行业务代码...}finally{//释放锁lock.unlock();}}else{//执行获取锁失败的业务代码...}}catch(InterruptedExceptione){e.printStackTrace();}总结lock(),tryLock(),tryLock(long,TimeUnit),lockInterruptibly()都是用来获取锁的,如果获取不到锁,lock方法会一直阻塞等待;而lockInterruptibly方法也会阻塞等待获取锁,但是可以响应线程的中断;不带参数的tryLock方法会立即返回一个获取锁成功或失败的结果,带参数的tryLock(long,TimeUnit)方法会在设定的时间内返回一个获取锁成功或失败的结果。这四种方式的特点各不相同,需要根据实际业务情况选择合适的获取锁的方式。判断是非在自己,名誉在别人,得失在人数。公众号:Java面试真题分析面试合集:https://gitee.com/mydb/interview
