import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; /** * @Description: * @date: 2020-08-26 20:03 * @author: yff */ public class TryLockTest { private Lock lock = new ReentrantLock(); public static void main(String[] args) { final TryLockTest test = new TryLockTest(); for (int i = 0; i < 2; i++) { new Thread(() -> test.go_2(Thread.currentThread())).start(); } } //tryLockTest_1 public void go(Thread thread) { if (lock.tryLock()) { try { System.out.println(thread.getName() + "得到了锁"); Thread.sleep(3000); } catch (Exception e) { } finally { System.out.println(thread.getName() + "释放了锁"); lock.unlock(); } } else { System.out.println(thread.getName() + "获取锁失败"); } } //tryLockTest_2 public void go_2(Thread thread) { boolean result = lock.tryLock(); System.out.println(thread.getName() + "获得锁的结果:" + result); System.out.println(thread.getName() + "得到了锁"); try { Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(thread.getName() + "释放了锁"); lock.unlock(); } }
上结论:会。
tryLock会立即返回一个结果,表明自己是否获得了锁,但是不管获得与否,不会影响每个线程各自的继续执行。
方法go_2中,如果没有对【获得到锁的结果进行区分】,那么不管是否获得到锁,执行的代码都是一样的,也没有线程会被阻塞(与lock方法不同。
所以,使用tryLock的时候,在得到锁与否的后续中,一定要做好代码区分,因为就算没得到锁的线程也会继续执行与得到了锁的线程相同的代码