17-其他说明
其他说明
除此之外, Lock 接口(包括 ReentrantLock 类)也提供了 tryLock() 方法来获得锁。该方法和 lock() 方法的最大区别在于,如果当前线程没有获得锁,则 tryLock() 方法将立即给调用该方法的线程返回 false 并且不会使线程进入休眠状态。当然,开发者也可以给 tryLock() 方法传递时间值和 TimeUnit 对象来指定线程的最长等待时间,若超出指定时间后线程仍未获得锁的使用权,则该方法将返回 false 。另外, TimeUnit 类是具有以下常量的枚举: DAYS 、 HOURS 、 MICROSECONDS 、 MILLISECONDS 、 MINUTES 、 NANOSECONDS 和 SECONDS 。这些常量均用来表示传递给函数的时间单位。
需要注意的是,开发者需要妥善处理 `tryLock()` 方法的返回值,线程在返回值为 `false` 时不应该继续进入临界区,否则程序可能会产生令人匪夷所思的结果。
ReentrantLock 类同样允许线程递归调用。也就是说,如果一个线程已经获得了锁的控制权并递归地获取锁,则该线程依然可以获得该锁的控制权。因此当同一个线程通过递归式调用 lock() 方法时,该方法将会立即给出返回结果并访问该线程。同样,在释放锁的使用权时,此前请求了多少次 lock() 方法,此后也需要请求相同次数的 unlock() 方法来释放锁的控制权。
需要注意的是,开发者需要妥善处理 `tryLock()` 方法的返回值,线程在返回值为 `false` 时不应该继续进入临界区,否则程序可能会产生令人匪夷所思的结果。