Java中的锁

Java中的锁优化 锁优化是提高程序并发性能的关键手段,包括使用合适的锁类型如读写锁、可重入锁以适应不同场景;减小锁粒度,将锁作用范围限制在小范围代码或数据上以减少锁竞争;锁分离,将不同功能或数据用不同锁管理以避免不必要竞争;锁粗化,合并细小锁减少请求释放次数但需注意锁竞争;使用乐观锁,基于版本号控制并发,适合写少读多场景;以及使用无锁算法,通过原子操作、CAS等保证数据正确性,适合高并发低延迟场景。 阅读详情

Java中的锁

Lock锁

Lock锁介绍

JavaSE 5之后,并发包中新增了Lock**接口(以及相关实现类)锁功能,它提供了与synchronized关键字类似的同步功能,只是在使用时需要显式地获取和释放锁,虽然它缺少了(通过synchronized块或者方法所提供的)隐式获取释放锁的编写性,但是却拥有了锁获取与释放的可操作性、可中断性以及超时获取锁**等多种synchronized关键字所不具备的同步特性。

Lock锁的使用

lock锁的使用也十分简单。

Lock lock = new ReentrantLock();
lock.lock();
try{   
}finally{
    lock.unlock();
}

在finally块中释放锁,目的是保证在获取到锁之后,最终能够被释放。

不要将获取锁的过程写在try块中,因为如果在获取锁(自定义锁的实现)时发生了异常,异常抛出的时候,也会导致锁无故释放。

Lock接口提供的synchronized所不具备的主要特性

特性描述
尝试非阻塞地获取锁当前线程尝试获取锁,如果这一时刻没有被其他线程获取到,则成功获取并持有锁
能被中断地获取锁与synchronized不同,获取到锁的线程能够响应中断,当获取到锁的线程被中断时,中断异常将会被抛出,同时锁会被释放。
超时获取锁在指定的截止时间之前获取锁,如果截止时间到了仍旧无法获取锁,则返回

Lock的API

方法名称描述
void lock()获取锁,调用该方法当前线程将会获取锁,当锁获得后,从该方法返回
void lockInterruptibly() throws InterruptedException可中断地获取锁,和lock方法的不同在于该方法会响应中断,即在锁的获取中可以中断当前线程
boolean tryLock()尝试非阻塞地获取锁,调用该方法后立刻返回,如果能够获取则返回true,否则返回false
boolean tryLock(long time,TimeUnit unit)throws InterrupttedException超时的获取锁,当前线程在以下3种情况下会返回:1.当前线程在超时时间内获取了锁,返回true**2.当前线程在超时时间内被中断,抛出异常**3.超时时间结束,返回false
void unlock()释放锁
Condition newCondition()获取等待通知组件,该组件和当前的锁绑定,当前线程只有获得了锁,才能调用组件的wait()方法,而调用后,当前线程将被释放

队列同步器(AbstractQueuedSynchronizer)

队列同步器的介绍

队列同步器是用来构建锁或者其他同步组件的基础框架,它使用了一个int成员变量表示同步状态,通过内置的FIFO队列来完成资源获取线程的排队工作,并发包的作者(Doug Lea)期望它能够成为实现大部分同步需求的基础。

重写同步器指定的方式时,需要使用同步器提供的如下3个方法来访问或修改同步状态

方法名称描述
getState()获取当前同步状态
setState(int newState)设置当前同步状态
compareAndSetState使用CAS设置当前状态,该方法能够保证状态设置的原子性

同步器可重写的方法

方法名称描述
protected boolean tryAcquire(int arg)独占式获取同步状态,实现该方法需要查询当前状态并判断同步状态是否符合预期,然后再进行CAS设置同步状态
protected boolean tryRelease(int arg)独占式释放同步状态,等待获取同步状态的线程将有机会获取同步状态
protected int tryAcquireShared(int arg)共享式获取同步状态,返回大于等于0的值,表示获取成功,反之,获取失败
protected boolean tryReleaseShared(int arg)共享式释放同步状态
protected boolean isHeldExclusively()当前同步器是否在独占模式下被线程占用,一般该方法表示是否被当前线程所独占

自定义同步器运用demo

import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.AbstractQueuedSynchronizer;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;

public class Mutex implements Lock{
    //静态内部类,自定义同步器
    private static class Sync extends AbstractQueuedSynchronizer{
        //是否处于占用状态
        protected boolean isHeldExclusively() {
            return getState() == 1;
        }
        //当状态为0的时候获取锁
        public boolean tryAcquire(int acquires) {
            if(compareAndSetState(0,1)) {
                setExclusiveOwnerThread(Thread.currentThread());
                return true;
            }
            return false;
        }
        //释放锁,将状态设置为0
        protected boolean tryRelease(int releases) {
            if(getState() == 0) {
                throw new IllegalMonitorStateException();
            }
            setExclusiveOwnerThread(null);//可以由线程以独占方式拥有的同步器。此类为创建锁和相关同步器(伴随着所有权的概念)提供了基础
            setState(0);
            return true;
        }
        //返回一个Condition,每个condition都包含了一个condition队列
        Condition newCondition() {
            return newCondition();
        }
    }
    //仅需要将操作代理到Sync上即可
    private final Sync sync = new Sync();
    @Override
    public void lock() {
        sync.acquire(1);
    }
    @Override
    public void lockInterruptibly() throws InterruptedException {
        sync.acquireInterruptibly(1);
    }
    @Override
    public Condition newCondition() {       
        return sync.newCondition();
    }
    @Override
    public boolean tryLock() {
        return sync.tryAcquire(1);
    }
    @Override
    public boolean tryLock(long timeout, TimeUnit unit) throws InterruptedException {
        return sync.tryAcquireNanos(1,unit.toNanos(timeout));
    }
    @Override
    public void unlock() {
        sync.release(1);
    }
    public boolean isLocked() {
        return sync.isHeldExclusively();
    }
    public boolean hasQueuedThreads() {
        return sync.hasQueuedThreads();
    }   
}

上述实例中,独占锁Mutex是一个自定义同步组件,它在同一时刻只允许一个线程占有锁。Mutex中定义了一个静态内部类,该内部类继承了同步器并实现了独占式获取和释放同步状态。

重入锁(ReentrantLock)

重入锁的介绍

重入锁ReentrantLock,顾名思义,就是支持重进入的锁,它表示该锁能够支持一个线程对资源的重复加锁。除此之外,该锁的还支持获取锁时的公平和非公平性选择。synchronized关键字隐式地支持重进入,比如一个synchronized修饰的递归方法,在方法执行时,执行线程在获取了锁之后仍能连续多次地获得该锁。

锁获取的公平性问题

在绝对时间上,先对锁进行获取的请求一定先被满足,那么这个锁时公平的,反之,是不公平的。公平的获取锁,也就是等待时间最长的线程最优先获取锁,也可以说锁获取是顺序的。ReentrantLock提供了一个构造函数,能够控制锁是否公平。

事实上,公平锁机制往往没有非公平的效率高。

公平性与否是针对获取锁而言的,如果一个锁是公平的,那么锁的获取顺序就应该符合请求的绝对时间顺序,也就是FIFO(先进先出)。

对于非公平锁,只要CAS设置同步状态成功,则表示当前线程获取了锁。

实现重进入的方式

重进入是指任意线程在获取到锁之后能够再次获取该锁而不会被锁所阻塞,该特性的实现需要解决以下两个问题。

1>线程再次获取锁。 锁需要去识别获取锁的线程是否为当前占据锁的线程,如果是,则再次成功获取。

2>锁的最终释放。 线程重复n次获取了锁,随后在第n次释放该锁后,其他线程能够获取到该锁。锁的最终释放要求锁对于获取进行计数自增,计数表示当前锁被重复获取的次数,而锁被释放时,计数自减,当计数等于0时表示锁已经成功释放。

读写锁

读写锁的介绍

之前提到锁基本是都是排他锁,这些锁在同一时刻只允许一个线程进行访问,而读写锁在同一时刻可以允许多个线程访问,而读写锁在同一时刻可以允许多个读线程访问,但是在写线程访问时,所有的读线程和其他写线程均被阻塞。读写锁维护了一对锁,一个读锁和一个写锁,通过分离读锁和写锁,使得并发性相比一般的排他锁有了很大提升。

一般情况下,读写锁的性能都会比排它锁好,因为大多数场景读是多于写的。在读多余写的情况下,读写锁能够提供比排它锁更好的并发性和吞吐量。Java并发包提供读写锁的实现是ReentrantReadWriteLock。

ReentrantReadWriteLock的特性

特性说明
公平性选择支持非公平(默认)和公平的锁获取方式,吞吐量还是非公平优于公平
重进入该锁支持重进入,以读写线程为例:读线程在获取了读锁之后,能够再次获取读锁。而写线程在获取了写锁之后能够再次获取写锁,同时也可以获取读锁
锁降级遵循获取写锁,获取读锁再释放写锁的顺序,写锁能够降级成为读锁

ReentrantReadWriteLock展示内部工作状态的方法

方法名称描述
int getReadLockCount()返回当前读锁被获取的次数。该次数不等于读锁的线程数,例如,仅一个线程,它连续获取(重进入)了n次读锁,那么占据读锁的线程数是1,但该方法返回n
int getReadHoldCount()返回当前线程获取读锁的次数
boolean isWriteLocked()判断写锁是否被获取
int getWriteHoldCount()返回当前写锁被获取的次数

读写锁使用demo

下面通过一个缓存示例说明读写锁的使用方式

import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantReadWriteLock;

public class Cache {
    static Map<String,Object> map = new HashMap<String,Object>();
    static ReentrantReadWriteLock rwl = new ReentrantReadWriteLock();
    static Lock r = rwl.readLock();
    static Lock w = rwl.writeLock();
    //获取一个key对应的value
    public static final Object get(String key) {
        r.lock();
        try {
            return map.get(key);
        }finally {
            r.unlock();
        }
    }
    //设置key对应的value,并返回旧的value
    public static final Object put(String key,Object value) {
        w.lock();
        try {
            return map.put(key,value);
        }finally {
            w.unlock();
        }
    }
    //清空所有的内容
    public static final void clear() {
        w.lock();
        try {
            map.clear();
        }finally {
            w.unlock();
        }
    }
}

上述示例中,Cache组合一个非线程安全的HashMap作为缓存的实现,同时使用读写锁的读锁和写锁来保证Cache是线程安全的。在读操作get方法中,需要获取读锁,这使得并发访问该方法时不会被阻塞。写操作方法和clear,在更新hashmap必须提前获得写锁,当获取写锁后,其他线程对于读锁和写锁的获取均被阻塞,而只有写锁被释放之后,其他读写操作才能继续。

Condition接口

在介绍lock锁的时候,我们谈到了一个方法是Condition newCondition(),提到了是获取等待通知组件。

那么我们就来好好学习下Condition接口。

Condition接口的介绍

任意一个Java对象,都拥有一组监视器方法(定义在java.lang.Object上),主要包括wait()、wait(long timeout)、notify()、notifyAll()方法,这些方法与synchronized同步关键字配合,可以实现等待/通知模式。Condition接口也提供了类似Object的监视器方法,与Lock配合也可以等待/通知模式,但是这两者在使用方式以及功能特性上还是右差别的。

Object的监视器方法与Condition接口的对比

对比项Object Monitor MethodsCondition
前置条件获取对象的锁调用Lock.lock()获取锁,调用Lock.newCondition()获取Condition对象
调用方式object.wait()condition.await()
等待队列个数一个多个
当前线程释放锁并进入等待状态支持支持
当前线程释放锁并进去等待状态,在等待状态中不响应中断不支持支持
当前线程释放锁并进入超时等待状态支持支持
当前线程释放锁并进入等待状态到将来的某个时间不支持支持
唤醒等待队列中的一个线程支持支持
唤醒等待队列中的全部线程支持支持

Condition接口demo

Lock lock = new ReentrantLock();
Condition condition = lock.newCondition();

public void conditionWait() throws InterruptedException{
    lock.lock();
    try{
        condition.await();
    }finally{
        lock.unlock();
    }
}

public void conditionSignal() throws InterruptedException {
    lock.lock();
    try{
        condition.signal();
    }finally{
        lock.unlock();
    }
}

Condition定义的部分方法以及描述

方法名称描述
void await() throws InterruptedException当前线程进入等待状态直到被通知(signal)或中断,当前线程将进入运行状态且从await()方法返回的情况,包括:其他线程调用该Condition的signal()或signAll()方法,而当前线程被选中唤醒(1.其他线程(调用interrupt方法)中断当前线程 2.如果当前线程从await()方法返回,那么表明该线程已经获取了Condition对象所对应的锁)
void awaitUninterruptibly()当前线程进入等待状态直到被通知,从方法名称上可以看出该方法对中断不敏感
long awaitNanos(long nanosTimeout) throws InterruptedException当前线程进入等待状态直到被通知、中断或者超时。返回值表示剩余的时间,如果在nanosTimeout纳秒之前被唤醒,那么返回值就是(nanosTimeout-实际耗时)如果返回值是0或者负数,那么可以认定已经超时了
boolean awaitUntil(Date deadline) throws InterruptedException当前线程进入等待状态直到被通知、中断或者某个时间。如果没有到指定时间就被通知,方法返回true,否则,表示到了指定时间,方法返回false
void signal()唤醒一个等待在Condition上的线程,该线程从等待方法返回前必须获得与Condition相关联的锁
void signalAll()唤醒所有等待在Condition上的线程,能够从等待方法返回的线程必须获得与Condition相关联的锁

​ 参考资料:《Java并发编程的艺术》

Java多线程编程系列:使用Lock锁实现线程同步 除了基本的获取锁和释放锁操作之外,Lock接口还提供了其他一些常用的方法,比如tryLock()方法用于尝试获取锁,如果锁可用则立即返回true,否则返回false;在doSomething()方法中,我们先调用lock()方法获取锁,然后执行需要进行线程同步的代码块,最后在finally块中调用unlock()方法释放锁。在代码块执行完毕后,使用finally块来释放锁,确保锁的释放不会受到异常的影响。在需要进行线程同步的代码块前调用Lock对象的lock()方法获取锁。 阅读详情

相关推荐

锁的艺术:Java并发中的常用锁策略与实践

对java锁相关内容进行整理分析:乐观锁 VS 悲观锁+自旋锁 VS 适应性自旋锁+无锁 VS 偏向锁 VS 轻量级锁 VS 重量级锁+公平锁 VS 非公平锁+可重入锁 VS 非可重入锁+独享锁 VS 共享锁

曾经“等你生日那天”都遥远得像未来,如今却可欢愉的挥手说“下个十年见” 171万+

使用线程锁(Lock)实现线程同步

任务描述 本关任务:使用Lock,实现对于某一块代码的互斥访问。 相关知识 上一关我们谈到了synchronized关键字,synchronized关键字主要用来同步代码,实现同步互斥访问,也就是在同一时刻只能有一个线程访问临界资源。从而解决线程的安全问题。 如果一个方法或者代码块被synchronized关键字修饰,当线程获取到该方法或代码块的锁,其他线程是不能继续访问该方法或代码块的。 而其他线程要能访问该方法或代码块,就必须要等待获取到锁的线程释放这个锁,而在这里释放锁只有两种情况:

weixin_55450615的博客 2105

新手避坑指南:用镭神C32和KVH 1750 IMU做标定,为什么直接上lidar_align会失败?

本文详细解析了使用镭神C32激光雷达和KVH 1750 IMU进行标定时常见的失败原因及解决方案。从IMU的微分传感器特性到Lidar-IMU标定的数学本质,再到可行的标定方案和实操注意事项,帮助新手避开认知陷阱,掌握正确的标定方法。

weixin_30162121的博客 327

头歌 第3关:使用线程锁(Lock)实现线程同步

java 头歌 多线程的使用

qq_53679247的博客 3140

无人机飞控传感器全解析:从IMU到光流传感器的实战应用

本文深入解析了无人机飞控系统的核心传感器,从IMU、气压计、磁力计到光流传感器,详细阐述了其工作原理、数据融合策略及常见挑战。结合ICF5、Pixhawk 6C等主流飞控硬件,提供了从传感器校准、滤波器调优到应对室内光流定位、强磁干扰等实战场景的系统性优化指南,帮助开发者突破飞控“黑箱”,实现更稳定、可靠的飞行控制。

weixin_28396629的博客 169

【2025CVPR】基于脉冲神经网络的能效目标检测模型:Multi-scale Spiking Detector(MSD)深度解析

本文提出了一种创新的多尺度脉冲神经网络目标检测器(MSD),通过生物启发的ONNB模块和MSDF框架实现了高效准确的目标检测。该模型采用端到端直接训练策略,在COCO数据集上达到62.0%mAP的精度,同时仅需7.8M参数和6.43mJ能耗,较传统方法提升2.8%精度并降低82.9%能耗。实验验证了其在小目标检测和事件数据处理的优越性,为边缘计算应用提供了新范式。

hasakie的博客 1109

Java线程生命周期和锁的简单使用

本文介绍了java线程的生命周期,Synchronized的几个方法简单的使用。 线程生命周期 初始状态(New) New Thread之后,   就绪状态(Ready) 表示获取到了Cpu的执行时间片,也就是cpu的执行权,等待开始执行。   运行状态(Runable) 执行start之后,开始运行。   阻塞状态(Blocked) 在进入sync...

lantao 329

中科蓝讯蓝牙耳机SDK实战:从目录解析到消息处理框架

本文深入解析中科蓝讯蓝牙耳机SDK的目录结构与消息处理框架,提供从硬件驱动到蓝牙功能定制的实战指南。重点剖析SDK核心模块如消息队列机制、按键事件处理及电量报告优化,并分享二次开发中的调试技巧与避坑经验,助力开发者高效完成TWS耳机功能定制。

weixin_30335575的博客 388

多线程--线程同步锁Lock锁

多线程–线程同步锁–Lock锁-ReentrantLock 之前说了线程同步机制Synchronize锁,其实除此之外还有一种JUC的Lock锁也能实现线程同步。而且Lock实现类ReentrantLock相比Synchronize有更大的灵活性,更加丰富,更是适合大多场景的使用。 先来简单的对比下ReentrantLock和Synchronize吧。 Synchronsize锁是独占锁,加锁和释放锁都是自动的,只要加上关键字synchronize或者代码块就行。使用起来很简单,但是呢灵活性较差。Ree

qq_31142237的博客 1618

Epicor ERP 界面新增客制化字段操作方法

我发现国内对于epicor这个erp软件的教程非常少,所以录制一些我实际遇到的需求,整理了实现过程,提供给大家参考。

cqxianggang的专栏 413

YOLOv11改进 | 主干/Backbone篇 | 轻量级移动端网络ShuffleNetV2(附代码+修改教程)

本文给大家带来的改进内容是ShuffleNetV2,这是一种为移动设备设计的高效CNN架构。其在ShuffleNetV1的基础上强调除了FLOPs之外,还应考虑速度、内存访问成本和平台特性。(我在YOLOv11n上修改该主干降低了GFLOPs,但是参数量还是有一定上涨,其非常适合轻量化的读者来使用,同时精度也有一定程度的上涨)。本文通过介绍其主要框架原理,然后教你如何添加该网络结构到网络模型中。

Snu77的博客 3388

java中的各种锁

java中的各种锁详细介绍 转自:https://tech.meituan.com/2018/11/15/java-lock.html Java提供了种类丰富的锁,每种锁因其特性的不同,在适当的场景下能够展现出非常高的效率。本文旨在对锁相关源码(本文中的源码来自JDK 8)、使用场景进行举例,为读者介绍主流锁的知识点,以及不同的锁的适用场景。 Java中往往是按照是否含有某一特性来定义锁,我们通过特性将锁进行分组归类,再使用对比的方式进行介绍,帮助大家更快捷的理解相关知识。下面给出本文内容的总体分类目

u013733643的博客 3万+

dji psdk开发 关于SDK认证芯片的使用

Payload SDK V3.10.0 于 2025-1-8 发布,增加了 Matrice 4T/4E 机型支持,同时也增加了 DJI SDK 认证芯片(DJI SDK CC)功能支持。关于认证芯片的介绍大疆 SDK 认证芯片(DJI SDK Certified Chip),简称 DJI SDK CC,用于认证基于 DJI Eport/Eport-Lite 接口开发的第三方负载设备,确保设备能够正常工作并与无人机可以进行有效通信,起到负载安全认证和功能授权的作用。

热爱生活,忠于自己 2149

Java中的锁都有什么

资源有序分配法指的是,线程 A 和 线程 B 获取资源的顺序要一样,当线程 A 先尝试获取资源 A,然后尝试获取资源 B 的时候,线程 B 同样也是先尝试获取资源 A,然后尝试获取资源 B。当一个线程尝试获取某个锁时,如果该锁已被其他线程占用,就一直循环检测锁是否被释放,而不是进入线程挂起或睡眠状态,直到获取到某个锁超过一定的自旋次数后才会阻塞线程。但是如果线程间存在锁竞争,偏向锁会失效,此时会涉及到锁的撤销,将锁状态升级为适合多线程竞争的轻量级锁或者重量级锁,这个过程可能会引入额外的开销,影响性能。

努力分享一些干货 1756

【DeepSeek R1构建本地RAG知识库】数据结构化清洗-工作流自动清洗

在构建本地RAG知识库时,数据结构化清洗是关键但繁琐的步骤。传统方法效率低且易出错,而低代码/无代码平台如Dify提供了更高效的解决方案。Dify通过可视化工作流设计,集成大模型智能处理,支持多格式输入输出,无需编码即可完成复杂的数据清洗任务。文章详细介绍了数据结构化的核心困境、目标、价值及类型,并比较了TXT与Markdown在RAG系统中的适用性。最后,通过Dify平台实战演示了如何在20分钟内完成规则制度文档的结构化清洗,输出标准化数据,展示了自动化工作流在数据处理中的高效性和便捷性。

少说,多做 1222

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

Java中的锁升级

关于锁升级的四种级别,即如何升级

热爱编程的菜鸟 9820

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Java中的锁总结

并发编程、锁、synchronized、ReentrantLock、AQS、CAS

m0_73866527的博客 1351

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

一文足以了解什么是 Java 中的锁

作者 |cxuan责编 |ElleJava 锁分类Java 中的锁有很多,可以按照不同的功能、种类进行分类,下面是我对 Java 中一些常用锁的分类,包括一些基本的概述从线程是否需...

优快云资讯 5103

java中的锁详解

AQS就是AbstractQueuedSynchronizer抽象类,AQS其实就是JUC包下的一个基类,JUC下的很多内容都是基于AQS实现了部分功能,比如ReentrantLock,ThreadPoolExecutor,阻塞队列,CountDownLatch,Semaphore,CyclicBarrier等等都是基于AQS实现。首先AQS中提供了一个由volatile修饰,并且采用CAS方式修改的int类型的state变量。

埃泽漫笔 2874

Java中的锁的分类以及锁优化

Java中的锁的分类以及锁优化 只要涉及到并发问题,同步往往并不可少的,而同步的实现比较简单的方式就是加锁。 Java锁的种类 乐观锁/悲观锁 乐观锁:通俗地说就是不管是否有并发问题的风险,先进行操作,如果没有其他线程争用共享数据,那操作就成功了;如果共享的数据的却被争用,产生了冲突,那再进行其他的补偿措施,最常用的补偿措施是不断地重试,直到出现没有竞争地共享数据为止;常见的乐观锁实现机制有两种: CAS操作 CAS(Compare and Swap 比较并交换),当多个线程尝试使用CAS同时更新同一

小小小小小乐的博客 1557

Java中的各种锁

重量级锁竞争的时候,还可以使用自旋来进行优化,如果当前线程自旋成功(即这时候持锁线程已经退出了同步块,释放了锁),这时当前线程就可以避免阻塞。当加锁对象不可能被其他线程共享时,加的锁,会被即时编译(JIT)自动消除。的值恢复给对象头,失败(因为,对象状态变了,不是轻量级锁了)。次后,所有的锁对象都会撤销偏向锁,包括之后新建的锁对象,直接就是轻量锁。轻量级锁在没有竞争时(就自己这个线程),每次重入仍然需要执行。次的撤销(从偏向锁转为轻量锁),当前线程累积。次以上,就会批量重定向,锁对象的。

胡云峰的博客 957

Java 公平锁与非公平锁详解

对比维度公平锁非公平锁排队机制严格遵守FIFO允许插队吞吐量较低较高响应时间可预测不确定实现难度较复杂较简单避免饥饿能不能核心结论公平锁保障绝对的请求顺序非公平锁提供更高的吞吐量Java中锁的默认行为是非公平的(符合大多数场景)在需要严格顺序的业务中才使用公平锁。

yuren_xia的博客 999

Java中的锁和数据库的锁

面试中经常被问到锁,Java中有锁,数据库中也有锁,这两个中的锁都是怎么分类的呢?有两篇博客关于这个问题讲的特别好,详见下文~ Java中的锁 在读很多并发文章中,会提及各种各样锁如公平锁,乐观锁等等,这篇文章介绍各种锁的分类。介绍的内容如下: 公平锁/非公平锁 可重入锁 独享锁/共享锁 互斥锁/读写锁 乐观锁/悲观锁 分段锁 偏向锁/轻量级锁/重量级锁 自旋锁 上面是很多...

qq_28323595的博客 4729

Java 中的各种锁详解

自旋锁的定义:当一个线程尝试去获取某一把锁的时候,如果这个锁此时已经被别人获取(占用),那么此线程就无法获取到这把锁,该线程将会等待,间隔一段时间后会再次尝试获取。这种采用循环加锁 -> 等待的机制被称为自旋锁(spinlock)。ReentrantLock 是一把可重入锁,也是一把互斥锁,它具有与相同的方法和监视器锁的语义,但是它比 synchronized 有更多可扩展的功能。ReentrantLock 的可重入性是指它可以由上次成功锁定但还未解锁的线程拥有。当只有一个线程尝试加锁时,该线程调用。

在技术的广袤天地里,本博客如精准罗盘。剖析前沿科技,深掘代码奥秘,以精炼笔触,带您穿越复杂技术迷宫,速达知识彼岸。 1648

Java中的21种锁

本篇主要内容如下:本篇主要内容本篇文章已收纳到我的Java在线文档、 Github我的SpringCloud实战项目持续更新中。

tangjieqing的博客 2505
上一篇: 算法之动态规划(爬楼梯)
下一篇: 计算机网络小结
Jet_Green
博客等级 码龄9年 14粉丝 34原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值