美文网首页
Java 中锁的概念

Java 中锁的概念

作者: AaricChen | 来源:发表于2019-10-22 23:22 被阅读0次

了解各种锁的概念对并发编程很有帮助,本文将记录几种常见的锁概念。

乐观锁与悲观锁

悲观锁 是指对数据的修改持保守态度,认为数据很容易就会被其他线程修改,所以在数据被处理(读和写)前先对数据进行加锁。如果一个线程获取锁失败,则说明该数据正在被其他线程使用,当前线程则等待或者抛出异常。如果获取锁成功,则可以对数据进行操作,然后释放锁。

乐观锁 则认为数据在一般情况下不会造成冲突,所以在访问数据前不会加锁,而是在修改数据时对数据进行检查(通常是数据的版本,一般是version字段)而进一步决定后续步骤。如果数据没有冲突,则正常修改;如果数据版本产生了冲突,可以什么都不做,也可以重试。

公平锁与非公平锁

根据线程获取锁的机制,锁可以分为 公平锁非公平锁
公平锁 会根据线程获取锁的时间先后顺序来分配锁,即先获取锁的线程会先得到该锁。
非公平锁 则不会保证分配锁的先后顺序。

在 Java 中 ReentrantLock 提供了公平和非公平锁的实现。

ReentrantLock lock = new ReentrantLock(true); // 构造一个公平锁
ReentrantLock lock = new ReentrantLock(false); // 构造一个非公平锁

默认的无参构造函数是 非公平锁

在没有公平性需求的情况下尽量不要使用公平锁,保证公平性会带来额外的性能开销。

独占锁与共享锁

独占锁 同一时间只有一个线程能到的该锁。如:ReentrantLock
共享锁 可以同时由多个线程持有。如:ReadWriteLock 读写锁,它允许一个资源可以被多个线程同时进行读操作。

可重入锁

当一个线程已经获取一个对象的锁时,如果在释放该锁之前可以再次获取该对象的锁,那么则为 可重入锁

自旋锁

自旋锁 是当前线程在获取锁时,如果发现锁已经被其他线程占有,它不会马上阻塞自己,在不放弃 CPU 使用权的情况下,多次尝试获取(默认是 10 次),很有可能在后面几次的尝试中其他线程已经释放了该锁。如果尝试指定次数以后仍然没有获取到锁才会阻塞。

最后放在在用一张图回顾一下。

Java 中的锁

相关文章

  • Java 中锁的概念

    了解各种锁的概念对并发编程很有帮助,本文将记录几种常见的锁概念。 乐观锁与悲观锁 悲观锁 是指对数据的修改持保守态...

  • Java中锁的概念

    在谈锁之前,首先要理解一些常用的锁的分类名词: 1. 锁的常用分类 死锁:所谓死锁,就是多个线程同时被阻塞,它们中...

  • 锁的概述

    乐观锁与悲观锁 悲观锁 乐观锁和悲观锁的概念出自数据库,但在java并发包中也引入和类似的概念(乐观锁/悲观锁是一...

  • Java中锁概念总结

    Java开发过程涉及了很多锁,本篇对这些锁的概念进行了整理。 公平锁和非公平锁 公平锁:多个线程申请获取同一个锁,...

  • Java锁

    为解决程序中多个进程和线程对资源的抢占问题,在 Java 中引入了锁的概念 公平锁/非公平锁、可重入锁/不可重入锁...

  • Java中的锁

    对Java中的锁做了简单的罗列总结,以便于后期回顾。 本文对如下概念进行了总结:锁的意义;锁的定义与实现;Java...

  • 一张图读懂非公平锁与公平锁

    在Java并发编程中,公平锁与非公平锁是很常见的概念,ReentrantLock、ReadWriteLock默认都...

  • J.U.C源码阅读之AQS

    概念理解 1.AQS-- 指AbstractQueuedSynchronizer类。 AQS是java中管理“锁”...

  • ReentrantReadWriteLock了解

    Java锁概念 在讲这个类之前先简单说一下Java并发两个概念,共享锁,排他锁(独占锁)。共享锁就可以同时被多个线...

  • 理解synchronized

    1、概念 synchronized 是 Java 中的关键字,是利用锁的机制来实现同步的 对象锁&类锁 在 Jav...

网友评论

      本文标题:Java 中锁的概念

      本文链接:https://www.haomeiwen.com/subject/nhacvctx.html