Java锁详解

程序员 2024-10-7 17:03:36 44 0 来自 中国
【转载】原文链接
媒介

Java提供了种类丰富的锁,每种锁因其特性的差别,在得当的场景下可以大概显现出非常高的服从。本文旨在对锁相干源码(本文中的源码来自JDK 8和Netty 3.10.6)、利用场景举行举例,为读者先容主流锁的知识点,以及差别的锁的实用场景。
Java中每每是按照是否含有某一特性来界说锁,我们通过特性将锁举行分组归类,再利用对比的方式举行先容,资助各人更快捷的明确相干知识。下面给出本文内容的总体分类目次:
1. 乐观锁 VS 灰心锁

乐观锁与灰心锁是一种广义上的概念,体现了对待线程同步的差别角度。在Java和数据库中都有此概念对应的现实应用。
先说概念。对于同一个数据的并发利用,灰心锁以为自己在利用数据的时间肯定有别的线程来修改数据,因此在获取数据的时间会先加锁,确保数据不会被别的线程修改。Java中,synchronized关键字和Lock的实现类都是灰心锁。
而乐观锁以为自己在利用数据时不会有别的线程修改数据,以是不会添加锁,只是在更新数据的时间去判定之前有没有别的线程更新了这个数据。假如这个数据没有被更新,当火线程将自己修改的数据乐成写入。假如数据已经被其他线程更新,则根据差别的实现方式实验差别的利用(例如报错大概主动重试)。
乐观锁在Java中是通过利用无锁编程来实现,最常采取的是CAS算法,Java原子类中的递增利用就通过CAS自旋实现的。
根据从上面的概念形貌我们可以发现:

  • 灰心锁得当写利用多的场景,先加锁可以包管写利用时数据正确。
  • 乐观锁得当读利用多的场景,不加锁的特点可以大概使其读利用的性能大幅提升。
光说概念有些抽象,我们来看下乐观锁和灰心锁的调用方式示例:
您需要登录后才可以回帖 登录 | 立即注册

Powered by CangBaoKu v1.0 小黑屋藏宝库It社区( 冀ICP备14008649号 )

GMT+8, 2024-10-18 16:47, Processed in 0.109450 second(s), 32 queries.© 2003-2025 cbk Team.

快速回复 返回顶部 返回列表