正文
“锁”这个字在平时的生活中,频繁的出现在周围的生活中。在代码的世界里,锁的种类很多,比如:共享锁、排他锁、读写锁、行锁、表锁、间隙锁、next-key锁、记录锁、可重入锁等等等。当然上面的所说的种类分布于各个技术中。今天,一起来聊一聊显式锁和隐式锁。
在Java体系中,显式锁和隐式锁。分别是由ReentrantLock与synchronized这两个组件来展现的。显式锁:手动的加锁以及解锁。隐式锁,JVM层面自动的加锁以及解除锁。
synchronized(隐式锁)底层是由monitorenter和monitorexit实现的。JVM 自动的帮助实现对于共享代码区域的访问读写。ReentrantLock(显式锁)我们需要手动的加锁以及解锁。
所以使用锁选择的规则是可以分为2个纬度的。
第一个纬度就是对于Java语言的熟练程度,当不熟悉Java语言的运行机制,这个时候,选择synchronized是一个比较好的选择,避免了一些忘记的操作。ReentrantLock他是手动的,会忘记解锁,这个时候,其他的线程就会无限的等待。
第二个纬度就是根据业务来进行选择。当我们的业务属于高并发,大规模的请求的时候,如果使用synchronized会产生请求线程堆积的问题,如果一个业务的处理时间比较长的话,就会出现服务不可用、响应慢的情况,在严重就是服务直接挂掉。这个问题是非常严重的问题。这个时候,应当选择ReentrantLock,他足够的灵活,他给我们提供了一个有效的方法可以在有限的时间内查看是否自己获取到锁的信息,如果不能获取到,那么就会直接抛出异常,采用兜底服务处理。这就保证了防止请求的线程堆积造成严重的后果。所以,选择一个合适的锁,对于我们业务是十分重要的。要根据具体的环境选择合适的。