Java锁

VMware Workstation Pro 17 高效安装与激活指南 本文详细介绍了VMware Workstation Pro 17的高效安装与激活方法,包括系统要求、安装步骤、常见问题解决方案及性能优化技巧。通过专业的指导,帮助用户快速掌握这款强大的虚拟机软件,提升工作效率。 阅读详情

Java锁总览:

乐观锁:无锁编程,使用数据版本比较的方法来保证安全性,使用CAS(Compare And Swap)机制。乐观锁假设在大多数情况下不会发生冲突,因此在执行操作时不会加锁,而是在更新数据时检查是否有其他线程修改了数据。

悲观锁:通过synchronized关键字实现。悲观锁假设在任何时候都可能发生冲突,因此在执行操作前会先加锁,以确保数据的一致性。

自旋锁:同样基于CAS机制。自旋锁在尝试获取锁失败后,不会立即进入阻塞状态,而是循环等待一段时间,直到成功获取锁。

可重入锁:由synchronized关键字、ReentrantLock和Lock接口实现。可重入锁允许同一个线程多次获取同一把锁,而不会出现死锁的情况。

读写锁:通过ReentrantReadWriteLock实现。读写锁分为读锁和写锁,允许多个线程同时进行读操作,但写操作是独占的。

公平锁:通过ReentrantLock(true)实现。公平锁保证线程按照请求锁的顺序来获取锁,避免饥饿现象。

非公平锁:通过synchronized关键字和ReentrantLock(false)实现。非公平锁不保证线程获取锁的顺序,可能会导致某些线程长期得不到锁。

共享锁:在ReentrantReadWriteLock中用于读操作。共享锁允许多个线程同时持有读锁,但不允许写操作。

独占锁(排他锁、互斥锁、同步锁):通过synchronized关键字以及ReentrantReadWriteLock中的写锁实现。独占锁在同一时间只允许一个线程持有锁。

重量级锁:由synchronized关键字实现。重量级锁在Java早期版本中会导致线程挂起和唤醒的开销较大,但在JDK 1.6及以后版本中进行了优化。

轻量级锁和偏向锁:属于锁优化技术,用于减少锁的竞争和提升性能。轻量级锁在没有竞争的情况下使用,偏向锁则偏向于让一个线程长时间持有锁。

锁粗化和锁消除:都是锁优化技术,锁粗化是指将短时间的锁合并为长时间的锁,以减少锁的开销;锁消除则是指编译器自动识别并移除不必要的锁操作。


关键字介绍:

CAS(Compare And Swap):

        这是一种硬件指令级别的操作,用于实现乐观锁。它不使用锁,而是通过比较预期值与当前值是否相同来决定是否更新数据。如果不同,则说明数据已经被其他线程修改过,需要重新尝试。

    private AtomicInteger atomicValue = new AtomicInteger(0);
    public void incrementValue() {
        int expectedValue;
        int newValue;
        do {
            // 获取当前值
            expectedValue = atomicValue.get();
            // 计算新值
            newValue = expectedValue + 1;
            // 使用CAS尝试更新值
        } while (!atomicValue.compareAndSet(expectedValue, newValue));

        System.out.println("Updated Value: " + atomicValue.get());
    }

    @Test
    public void CAS() {
        incrementValue(); // 输出:Updated Value: 1
    }

        

synchronized:synchronized关键字-可用于代码块和方法

        是Java中的一种同步机制,可以视为悲观锁。
        可重入锁:允许同一个线程多次获取同一把锁。
        非公平锁:非公平锁允许插队,而公平锁则按照请求的顺序分配锁。
        独占锁/互斥锁:意味着在任何时刻只能有一个线程持有该锁。
        重量级锁:相对于轻量级锁而言,它涉及到操作系统层面的调度,开销较大。

    private int counter = 0; //假设这是共享资源
    private final Object lock = new Object(); // 定义一个锁对象 给synchronized代码块用

    //synchronized代码块
    public void incrementCounterBlock() {
        synchronized (lock) { // 锁定在特定对象上
            counter++;
            System.out.println("Counter incremented to: " + counter);
        }
    }

    //synchronized方法
    public synchronized void incrementCounterMethod() {
        counter++;
        System.out.println("Counter incremented to: " + counter);
    }

    //模拟多线程操作
    @Test
    public void synchronizedTest() throws InterruptedException {
        Thread t1 = new Thread(() -> {
            for (int i = 0; i < 5; i++) {
                //incrementCounterMethod();也行
                incrementCounterBlock();
                try {
                    // 让当前线程短暂休眠,模拟实际工作并允许其他线程运行
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });

        Thread t2 = new Thread(() -> {
            for (int i = 0; i < 5; i++) {
                //incrementCounterMethod();也行
                incrementCounterBlock();
                try {
                    // 让当前线程短暂休眠,模拟实际工作并允许其他线程运行
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });

        t1.start();
        t2.start();
        // 等待所有线程完成
        t1.join();
        t2.join();
        System.out.println("Final Counter Value: " + counter);
    }

ReentrantLock:ReentrantLock.lock()和ReentrantLock.unlock(),创建ReentrantLock对象时,true为公平锁,false为非公平锁

        可重入锁:同synchronized一样,支持同一个线程多次获取同一把锁。
        构造函数参数ReentrantLock(boolean fair):当参数为true时,表示创建一个公平锁;false时,默认创建的是非公平锁。

    private int counter = 0; // 共享资源
    private final Lock lock = new ReentrantLock(true); // 创建一个ReentrantLock实例

    public void incrementCounter() {
        lock.lock(); // 获取锁
        try {
            counter++;
            System.out.println(Thread.currentThread().getName() + " incremented counter to: " + counter);
        } finally {
            lock.unlock(); // 确保在操作完成后释放锁
        }
    }

    @Test
    public void lockTest() throws InterruptedException {
        Thread t1 = new Thread(() -> {
            for (int i = 0; i < 5; i++) {
                incrementCounter();
                try {
                    // 模拟实际工作负载
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    Thread.currentThread().interrupt(); // 恢复中断状态
                }
            }
        });

        Thread t2 = new Thread(() -> {
            for (int i = 0; i < 5; i++) {
                incrementCounter();
                try {
                    // 模拟实际工作负载
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    Thread.currentThread().interrupt(); // 恢复中断状态
                }
            }
        });

        t1.start();
        t2.start();
        // 等待所有线程完成
        t1.join();
        t2.join();
        System.out.println("Final Counter Value: " + counter);
    }

ReentrantReadWriteLock:
        读写锁:允许多个读操作并发执行,但写操作是独占的。
        共享锁(读操作):允许多个线程同时读取资源。
        独占锁(写操作):确保在进行写操作时没有其他线程可以访问该资源。

    @Autowired
    private ProjectMapper projectMapper;
    //用于创建 读锁对象、写锁对象
    private final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
    //创建 读锁对象
    private final ReentrantReadWriteLock.ReadLock readLock = lock.readLock();
    //创建写锁对象
    private final ReentrantReadWriteLock.WriteLock writeLock = lock.writeLock();

    public Project getProjectById(Long id) {
        readLock.lock();
        try {
            return projectMapper.getProjectById(id);
        } finally {
            readLock.unlock();
        }
    }

    public List<Project> getAllProjects() {
        readLock.lock();
        try {
            return projectMapper.getAllProjects();
        } finally {
            readLock.unlock();
        }
    }

    @Transactional
    public void insertProject(Project project) {
        writeLock.lock();
        try {
            projectMapper.insertProject(project);
        } finally {
            writeLock.unlock();
        }
    }

    @Transactional
    public boolean updateProject(Project project) {
        writeLock.lock();
        try {
            int affectedRows = projectMapper.updateProject(project);
            if (affectedRows == 0) {
                System.out.println("Optimistic locking failed");
                return false;
            }
            return true;
        } finally {
            writeLock.unlock();
        }
    }

        使用 ReentrantReadWriteLock 的读锁(ReadLock)和写锁(WriteLock)是为了控制对共享资源的并发访问。读锁允许多个线程同时持有,只要没有写操作正在进行;而写锁是独占的,当一个线程获取了写锁时,其他任何读或写操作都必须等待。

用Simulink复现Hopf振荡器:从数学公式到稳定极限环的保姆级仿真教程 本文详细介绍了如何在Simulink中实现Hopf振荡器,从数学原理到仿真建模的全过程。通过参数调试和波形分析,帮助读者掌握Hopf振荡器的核心特性及其在机器人控制等领域的应用。特别强调了自适应调节技巧,提升系统稳定性和鲁棒性。 阅读详情

相关推荐

NXP KW47蓝牙MCU低功耗实测:从8μA睡眠到5年续航的优化实战

在物联网和嵌入式系统开发中,低功耗设计是决定电池供电设备续航能力的关键技术。其核心原理在于通过事件驱动、状态机管理和精细的电源域控制,使设备在空闲时进入深度睡眠,仅在需要时快速唤醒工作,从而将平均电流从毫安级降至微安级。这项技术的工程价值在于能够实现纽扣电池供电设备长达数年的使用寿命,广泛应用于智能家居传感器、可穿戴设备、资产追踪和工业监测等领域。以NXP KW47系列无线MCU为例,其集成的Arm Cortex-M33双核与专用射频单元,配合多级睡眠模式和高效DC-DC转换器,为超低功耗蓝牙应用提供了硬件

weixin_30162121的博客 257

Java 公平锁与非公平锁详解

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

yuren_xia的博客 999

一代测序、二代测序以及三代测序的优缺点及应用对比?

一、初现庐山真面目 一代测序:又称Sanger测序(多分子,单克隆) 历史:第一代DNA测序技术(又称Sanger测序)在1975年,由Sanger等人开创,并在1977年完成第一个基因组序列(噬菌体X174),全长5375个碱基。研究人员经过30年的实践并对技术及测序策略的不断改进(如使用了不同策略的作图法、鸟枪法),2001年完成的首个人类基因组图谱就是以改进了的Sanger法为其测序基础。 原理:在4个DNA合成反应体系(含dNTP)中分别加入一定比例带有标记的ddNTP(分为:ddATP...

wangprince2017 3万+

java的锁概括

java的锁概括

qq_40453972的博客 1684

云服务器安装ros教程

要在 CentOS 7 系统上安装 RouterOS,您需要将 RouterOS 安装为虚拟机或直接安装到物理硬盘上。这里提供的是将 RouterOS 安装到物理硬盘上的步骤,这将完全替换现有的 CentOS 7 系统。请确保您已经备份了所有重要数据。

qq_37662563的博客 2145

BeikeShop跨境电商独立站系统V1.5.0免授权全开源版

BeikeShop 一款开源好用的跨境电商系统,BeikeShop 是基于 Laravel 开发的一款开源商城系统,主要面向外贸/跨境电商行业提供商品管理、订单管理、会员管理、支付、物流、系统管理等功能。BeikeShop商城 Beike多语言商城 多货币商城B2C商城系统 代码100%开源 PHP商城系统 H5/PC商城 跨境电商系统 跨境商城系统 电商商城系统 Laravel 9 框架插件化开发,MVC架构 支持插件市场。Event 机制实现Hook功能,自定义可视化装修。

820

java锁Synchronized锁膨胀

在java中,synchronized锁的膨胀是指锁从轻量级状态逐步升级为更重的状态,以适应并发情况的变化。这种锁升级机制是为了在不同的线程竞争强度下提供合适的锁实现,最大化性能。锁的膨胀过程从“无锁”到“偏向锁”,再到“轻量级锁”,最终可能升级为“重量级锁”。这个机制通过减少不必要的线程阻塞和上下文切换,提高了性能。

weixin_41863236的博客 2016

Error: Flash Download failed - Target DLL has been cancelled

由于换了新电脑,keil重装了下,然而之前的MCU的支持包没有安装,以及一些其他的问题,导致可以编译但是不能将程序烧录到单片机中。现整理一下解决思路: 1、将支持包下载并添加: 找到你需要用的MCU的具体型号: 例如: 点击网址,下载安装包,或者在csdn等其他网址下载安装包,将下载好的pack包放到keil5的安装目录下的.Download中: 点击file中的import,将路径选择到.........

hanhan的博客 5万+

Java锁——什么是锁?

锁的概念基础与一些底层的分析

泯灭于众生,高歌于孤夜! 2490

Linux系统安全学习手册

Linux反弹shell Linux系统应急响应 Linux服务器安全加固 Linux下的用户、组和权限 Linux中的gcc Linux中su和sudo的用法和区别 Linux系统python2与python3共存 Linux中grep工具的使用 Linux中环境变量的设置 Linux中常见的150个命令(干货) Linux中编写Shell脚本 LNMP环境搭建Wordpress博客 LAMP环境搭建一个Discuz论坛 Linux运维比较常用的一些脚本 Linux系统中安装软

谢公子的博客 7532

研制过程评审活动(三)工程研制阶段

工程研制阶段主要任务、及评审活动

Abel的博客 2388

Java锁的种类

概述 锁大概有以下名词: 自旋锁、自旋锁的其他种类、阻塞锁、可重入锁、读写锁、互斥锁、悲观锁、乐观锁、公平锁、偏向锁、对象锁、线程锁、锁粗化、锁消除、轻量级锁、重量级锁、信号量、独享锁、共享锁、分段锁。 我们所说锁的分类其实应该按照锁的特性和设计来划分。 其实从并发的角度来讲,按照线程安全的三种策略看,主要内容都集中在互斥同步里,我们所讨论的锁也集中在这个部分,这个部分的锁都是悲观锁;第二个部分是非阻塞同步,这个部分也就一种通过CAS进行原子类操作,这个部分可以看成乐观锁,其实也就是不加锁;第三个部分是无同

抽象的螺旋 6228

5实践报告撰写

一 项目流程 明确标准 确定分析目标 寻找分析数据 清洗数据 描述性分析 诊断性分析 提出建议 撰写报告 二 确定分析目标 什么是你感兴趣的? 什么是你熟悉的? 什么是你擅长的? 1 电商零售行业 商品销量分析 价格分析 评价分析 ...... 2 自媒体行业 广告投放力度分析 广告投放回报分析 不同类型的产品分析 ...... 3 金融行业 股票价格分析 信贷业务违约分析 客户画像分析 ...... ...

waywardG的博客 2833

java—锁

1:这篇我们讲到了一些不同特性的锁,如悲观乐观,重量轻量等2:然后我们又讲到了CAS比较并交换的工作原理,以及它的ABA问题3:同时我们又谈到了sychronized的底层原理,以及早期sychronized的问题,并进行的锁升级的优化改进等。4:然后又对锁消除和锁粗化进行了大概的意思阐述。

m0_73233932的博客 1199

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Java中到底有哪些锁

读锁是共享锁,写锁是独享锁。在代码进入同步块的时候,如果同步对象锁状态为无锁状态(锁标志位为“01”状态,是否为偏向锁为“0”),虚拟机首先将在当前线程的栈帧中建立一个名为锁记录(Lock Record)的空间,用于存储锁对象目前的Mark Word的拷贝,然后拷贝对象头中的Mark Word复制到锁记录中。如果轻量级锁的更新操作失败了,虚拟机首先会检查对象的Mark Word是否指向当前线程的栈帧,如果是就说明当前线程已经拥有了这个对象的锁,那就可以直接进入同步块继续执行,否则说明多个线程竞争锁。

SevenCoding的博客 1408

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Java中有哪些锁?

是 Java 最基础的锁机制,用于实现方法或代码块的同步,保证多线程环境下的原子性、可见性和有序性。竞争激烈时,线程进入阻塞状态,依赖操作系统的互斥量(Mutex)管理。提供更灵活的读写锁控制,支持乐观读、悲观读、写锁三种模式,性能优于。允许多个线程同时读,但写线程独占资源,适用于读多写少的场景。读多写少且对性能要求极高的场景,但需谨慎处理锁转换逻辑。:默认抢占式获取锁,不保证等待时间长的线程优先获取。需要复杂同步控制的场景,如多条件等待、锁超时处理。:写线程获取锁时,禁止其他读/写操作。

qq_45906596的博客 2826

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Java并发 - Java中所有的锁

Java 中提供了多种锁机制,用于实现多线程之间的同步和互斥。

--土拨鼠-- 2309

Java中锁的分类

Java中锁的分类1、可重入锁/不可重入锁2、可中断锁3、公平锁/非公平锁4、独享锁(互斥锁)/共享锁(读写锁)5、乐观锁/悲观锁6、分段锁7、偏向锁/轻量级锁/重量级锁8、自旋锁 先来一段很常见的死锁代码: class Deadlock { public static String str1 = "str1"; public static String str2 = "str2"...

@龙猫的博客 3618

Java锁和锁的升级

本文介绍了Java中锁的基本知识和锁升级,包括无锁状态、偏向锁、轻量级锁和重量级锁。锁的升级过程根据竞争情况和线程的状态逐渐提升锁的级别。在多线程编程中,需要根据实际情况选择合适的锁类型,并注意锁的使用对程序性能的影响。公众号请关注"果酱桑", 一起学习,一起进步!

果酱 の 博客 4043

java 有多少种锁_java有哪些锁?java锁种类盘点

学习java一定要全方面的了解java的知识,这样才能更好的运用到工作中去,比如java锁的知识点,那么接下来,我们就来给大家讲解一下java锁种类。大家可以参考以下文章。1.公平锁/非公平锁公平锁是指多个线程按照申请锁的顺序来获取锁。非公平锁是指多个线程获取锁的顺序并不是按照申请锁的顺序,有可能后申请的线程比先申请的线程优先获取锁。有可能,会造成优先级反转或者饥饿现象。2.可重入锁可重入锁又名递...

weixin_35645813的博客 4111

Java 公平锁与非公平锁

公平锁与非公平锁: 锁Lock分为公平锁和非公平锁。 公平锁:表示线程获取锁的顺序是按照加锁的顺序来分配的,及先来先得,先进先出的顺序。 非公平锁:表示获取锁的抢占机制,是随机获取锁的,和公平锁不一样的就是先来的不一定能拿到锁, 有可能一直拿不到锁,所以结果不公平。 公平锁实例: public class Service { private ReentrantLock lock; pub...

抛弃幻想,准备斗争 6762

Java中常见的锁

Java中常见的锁 一、悲观锁,乐观锁 1、悲观锁 定义:对于同一个数据的并发操作,悲观锁认为自己在使用数据的时候一定有其他线程来修改数据,因此在获取数据的时候会先加锁,确保数据不会被其他线程修改。Java中,synchronized关键字和Lock的实现类都是悲观锁。 2、乐观锁 定义:在并发操作时,认为不会有其他的线程来修改数据,所以不会加锁。在更新数据的时候会判断有没有其他线程更新这个数据。如果这个数据没有被更新,当前线程将自己修改的数据成功写入,如果数据已经被其他线程更新,则会根据不同的实现方

youngjre的博客 3440

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

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

小小小小小乐的博客 1557

java锁

如果一系列的连续操作都对同一个对象反复加锁和解锁,甚至加锁操作都是出现在循环体体之中,就算真的没有线程竞争,频繁地进行互斥同步操作将会导致不必要的性能损耗,所以就采取了一种方案:把加锁的范围扩展(粗化)到整个操作序列的外部,这样加锁解锁的频率就会大大降低,从而减少了性能损耗。如线程A持有资源x,线程B持有资源y,线程A等待线程B释放资源y,线程B等待线程A释放资源x,两个线程都不释放自己持有的资源,则两个线程都获取不到对方的资源,就会造成死锁。只能有一个线程获取锁,以独占的方式持有锁。

a1148233614的博客 891

Java锁详解

在 Java 多线程环境中,锁是确保共享资源线程安全的重要手段。当线程要操作共享资源时,需先获取对应的锁,以此保证在操作过程中,该资源不会被其他线程访问。待操作结束后,线程释放锁,使其他线程有机会获取并操作该资源。AQS 是 Java 并发包()的核心框架,通过一个变量表示锁状态,并利用Unsafe类实现原子操作(如 CAS)来管理线程竞争。状态不可逆:锁状态严格遵循 无锁 → 偏向锁 → 轻量级锁 → 重量级锁 的单向升级路径,避免因频繁状态切换带来的额外开销。性能优化策略。

qq_45675973的博客 1726

Java 锁优化详解

锁优化是提升并发程序性能的重要手段,Java 提供了多种锁优化机制,如锁粗化、锁消除、偏向锁、自旋锁等。通过合理使用这些优化技术,开发者可以减少锁的开销,提高程序的并发性能。在实际开发中,选择合适的锁策略和优化方法至关重要。对于读多写少的场景,可以使用读写锁;对于频繁访问的共享资源,可以使用无锁的并发类。理解锁优化的原理和最佳实践,可以帮助开发者编写高效的并发程序。

m0_38053034的博客 1192
上一篇: @Async注解
下一篇: Java 分布式锁
快乐吃手手  :  )
博客等级 码龄6年 119粉丝 25原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值