Java 中的悲观锁和乐观锁是什么意思?其分类依据是啥?
相信很多 Java 开发的朋友都会被 java 中的各种锁所迷惑,你是不是经常听到“可重入锁”、“互斥锁”、“轻量级锁”等关键词,其实 Java 中的锁的分类很多,不过这种分类都是针对场景的,好多人分不清或者记不住,是因为不知道这些锁为啥是这样的分类,本文瑞哥就用简洁的语言带大家走入 Java 中的锁,让我们直接开始!
一、锁的分类
Java 中的锁都是根据其特性进行分类的,我这边先给出分类的思维导图,然后我会一一讲解:
如图所示,我将锁分成了 6 类,那么每种分类的依据是什么?请往下看。
二、悲观锁 vs 乐观锁
2.1 悲观锁
悲观锁,“悲观”一词就解释了一切,我们在生活中常常回说“XX 太悲观”,那么悲观的人心思都很重,很多时候如果事情不能 100%成功,那么他都不会去尝试,做事前首先想到的就是事情假如失败了怎么办。
在 java 中,悲观锁也很像生活中悲观的人,悲观锁是这样的,假如有多个线程去访问同一个资源,当第一个线程访问的时候,因为是悲观锁,所以太怕出意外情况,因此系统会直接锁住这个资源,直到第一个线程释放锁,这就是悲观锁。
悲观锁提供了更好的数据完整性,但是锁的管理更难,如果您无法管理它,您的应用程序可能会遇到死锁。
2.2 乐观锁
乐观锁,字面意思“乐观”,想象一下生活中那些乐观的人,他们总是将事情想的很顺利,对什么事情都是往好的方向想,一般都是这样:管他呢,啥后果不后果的,万一成功了呢,先干再说。
在 java 中,乐观锁也很像生活中乐观的人,乐观锁是这样的,多个线程访问某个资源的时候,当第一个线程访问该资源的时候,它认为不会有其他线程(不考虑其他事情,认为什么都是好的)修改该资源,所以不会加锁,但是不加锁不代表没有任何操作,它会先判断一下这个资源有没有被其他线程修改过,如果没有修改,那么它就不管不顾的操作该资源,如果判断出被修改过,那么会执行其他操作,这个根据情况来看,一般就是重试或者直接抛出错误。
在大多数情况下,乐观锁定更有效并提供更高的性能。
2.3 分类依据
看完我上面对悲观锁和乐观锁的描述,你是不是已经直到分类的依据了呢?
不错,就是线程间是否需要锁住资源:需要锁住就是悲观锁,不需要锁住就是乐观锁。
2.4 悲观锁和乐观锁的使用场景
如果有大量更新并且用户尝试同时更新数据的机会相对较高,则悲观锁定很有用。
如果发生冲突的可能性非常低,乐观锁定很有用。
三、总结
本文主要介绍了悲观锁和乐观锁,其分类的依据就是线程间是否需要锁住资源需要锁住就是悲观锁,不需要锁住就是乐观锁。
希望本文对您认识悲观锁和乐观锁有所帮助,在阅读的同时有任何疑问可以在下方评论区与我讨论,下一篇文章,将带您了解一下自旋锁和应性自旋锁。
版权声明: 本文为 InfoQ 作者【wljslmz】的原创文章。
原文链接:【http://xie.infoq.cn/article/5a8d8f6f96d71e50e48961502】。未经作者许可,禁止转载。
评论