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