Java并发系列:什么是锁

CST新手必看:共面波导色散曲线绘制全流程(附参数设置避坑指南) 本文详细介绍了CST Microwave Studio中绘制共面波导色散曲线的全流程操作,特别针对新手常见的边界条件设置错误、参数扫描失效等问题提供解决方案。通过模型建立、边界条件设置、本征模求解器配置等步骤,帮助工程师快速掌握CPW色散特性分析方法,并附有参数设置避坑指南,提升高频电路设计效率。 阅读详情

场景引入

你肯定遇到过这样的场景:

你和你的女神正在约会,她说她想喝奶茶,你跑去奶茶店帮她买。

回来发现,她正在跟一个帅哥聊天,手里还拿着未开封的奶茶。

你站在原地不知所措……

把你和那位帅哥当做并发的线程,女神当做你们需要争抢的资源,是不是就能明白多线程状态下对象值的不安全之处了?

要是女神能在我处理完我的事之后再处理别人的事情,只对我专一,那该多好!

于是,锁的概念就出现了。

假设,女神只能同时接受一个舔狗的好意,只有等当前舔狗自己退出时才能继续接受别人的好意,这样是不是就能保证女神的专一了!

是的,就是这样,女神海王再也不能同时和8个舔狗一起聊天了,只能同时和一个人聊天,养鱼的效率大大降低!

什么是锁

回到主题,Java中锁是什么?为什么要有锁?

举个栗子

来看这样一段代码:

public class Sync {

    int num = 0;

    private void add() {
        System.out.println(Thread.currentThread().getName() + "-- num:" + ++num);
    }

    public static void main(String[] args) {
        Sync sync = new Sync();
        for (int i = 0; i < 1000; i++) {
            Thread thread = new Thread(sync::add);
            thread.start();
        }
    }
}

它的某次运行结果是这样的:

Thread-2-- num:2
Thread-3-- num:6
Thread-7-- num:7
Thread-8-- num:8
Thread-9-- num:9
Thread-10-- num:11
Thread-11-- num:12
Thread-12-- num:13
Thread-13-- num:14
Thread-6-- num:5
Thread-0-- num:1
Thread-4-- num:3
Thread-18-- num:19
Thread-5-- num:4

可以看到,如果按照线程的抢占顺序,线程一个一个的去修改num的值,那么在线程2(Thread-2)抢占到资源的时候,打印的结果应该是1才对,结果却是2。在线程3(Thread-3)抢占到资源的时候,打印的结果应该是3才对,结果却是6。

这说明线程在执行++num之前,也有别的线程获取到了num并对其进行了修改,所以++num的结果就跟预想中的不一样,这就是并发编程带来的问题。

那么,给这个资源加个锁试试?是否就能按照预想的那样,值是一个个累加的呢?

加锁

Java中可以用synchronized关键字对资源进行加锁。

来看,给对象加个锁:

private void add() {
    synchronized (this) {
        System.out.println(Thread.currentThread().getName() + " num:" + ++num);
    }
}

之后,它的运行结果是这样:

Thread-0 num:1
Thread-3 num:2
Thread-4 num:3
Thread-2 num:4
Thread-1 num:5
Thread-6 num:6
Thread-7 num:7
Thread-5 num:8
Thread-8 num:9
Thread-9 num:10
Thread-10 num:11

完全符合预期!

总结

锁的基本概念:

同一时间,该对象只允许一个线程去访问并修改资源

至于为什么要加锁?

加锁能够解决并发带来的资源同步问题和可能出现的奇怪错误。

不好理解?

很简单,你也不希望你的女神在跟你约会的时候还跟别的男人暧昧,对吧?

 

lenovo联想拯救者Legion Y9000P 2022款2023款2024款笔记本电脑(82RF,82WK,82WQ,83DE,83DF)原装出厂Windows11预装OEM系统镜像下载 联想原装出厂系统自带所有驱动、出厂主题壁纸、系统属性联机支持标志、系统属性专属LOGO标志、Office办公软件、联想电脑管家、联想浏览器、联想软件商店、legionzone控制中心等预装程序。链接:https://pan.baidu.com/s/1YBji_oh7xOkq-NxnS8Mm8g?链接:https://pan.baidu.com/s/1S7_enXmuoja1a9ASvUT5Fg?拯救者Legion Y9000P IRX9H 2024款【83DE】原厂Win11系统包。 阅读详情

相关推荐

为什么你的XGBoost多分类效果不如预期?可能是这5个参数没调对

本文深度剖析了XGBoost模型在处理多分类问题时效果不佳的五大关键参数陷阱。针对多分类问题的独特性,文章提供了max_depth、learning_rate、采样参数及正则化参数等核心参数的量化调整策略与诊断方法,帮助开发者精准调优,有效提升模型在各类别上的均衡性能与泛化能力。

weixin_29182481的博客 296

Java后端面经精简(锁篇)

用于解决父子任务有依赖并行计算问题,是分而治之的思想。使用方法:1.定义 RecursiveTask 或 RecursiveAction 的任务子类。2.初始化线程池及compute()方法计算任务,丢入线程池处理,取得处理结果。核心线程数量(设置数量时注意的点是看任务时更需要IO读写还是更需要CPU运算,如果是更多的是IO操作,那就属于IO密集型,可以参考的设置是核心数/2,如果是更需要CPU运算,就是属于CPU密集型,可以参考的设置是核心数+1)最大线程数量。

qq_40592590的博客 311

ENVI-met新手必看:从零开始创建城市微气候模型(附详细步骤+底图制作技巧)

本文为ENVI-met新手提供从零开始创建城市微气候模型的详细指南,包括环境准备、参数配置、底图制作技巧和三维模型构建步骤。特别针对常见问题提供解决方案,帮助初学者快速掌握城市微气候模拟技术,提升建模效率。

weixin_29269441的博客 407

众所周知后端离不开锁,那么锁怎么用,对谁用,为什么用,不用有什么后果呢?

锁机制是一种在计算机科学中广泛使用的技术,用于控制多个进程或线程对共享资源的访问。在多任务操作系统中,锁机制确保了当一个进程正在使用某个资源时,其他进程不能同时访问该资源,从而防止了数据不一致或冲突的问题。悲观锁悲观锁假设并发冲突会发生非常频繁,因此在整个操作过程中都会持有锁。例如,在数据库中,悲观锁通常是通过在数据行上使用语句来实现的,这样其他事务就无法修改这些行直到锁被释放。乐观锁乐观锁假设并发冲突发生的概率较低,因此不会在整个操作过程中持有锁。

LIUCHANGSHUO的博客 1082

FPGA高速通信双核解析:CMAC与Interlaken硬核的实战对比

本文深入对比了FPGA中两大高速通信硬核CMAC与Interlaken的核心差异与应用场景。CMAC作为标准以太网接入方案,适用于网卡、交换机等需对外互联的场景;而Interlaken则以极低延迟和高效通道化能力,专为芯片间、板间裸数据高速传输设计。文章通过实战案例与性能指标分析,为FPGA高速通信方案选型提供清晰指南。

f9g0h的博客 845

iOS安全和逆向系列教程 第18篇:iOS应用脱壳技术详解与实战

iOS应用脱壳技术详解与实战 摘要: 本文深入剖析了iOS应用脱壳技术,首先解释了加壳(如FairPlay DRM)与脱壳的基本概念及必要性。通过otool命令可以检测应用的加密状态。文章详细介绍了三种主流脱壳工具:经典dumpdecrypted工具的使用方法、现代化Clutch工具的安装配置以及基于Frida的高级脱壳方案frida-ios-dump。针对特殊情况,还提供了使用LLDB手动dump内存的技术细节,包括查找基地址、计算dump范围和内存读取等操作。最后介绍了修复Mach-O文件头的Pytho

一个自学不成材的程序员 710

Java后端:锁的底层原理都是什么?

因为:会锁住总线 或 cache line(MESI协议)CAS = CPU 原子指令 + 缓存一致性协议synchronized = 对象头 + CAS + OS mutexAQS = CAS + 队列 + park/unpark(基于 OS)

m0_67640079的博客 330

单反相机物镜设计[DG-10]

REAR(要打在像面,操作数要找像面对应位置15):以透镜单位表示的真实光线径向坐标,波长由Wave定义,参见“Hx、Hy、Px和Py”。最小玻璃厚度最小不能小于semi-dia的1/10,要根据layout看有没有过厚过薄,反复调节。PROD:两个操作数的乘积(操作#1 X操作#2)。3x4就是57.3x0.41=23.5。拦光一般在第一面和最后一面操作,减少边缘无用光线。光阑面与镜面贴近,要调距离,同时设置光阑像差。后截距是指从镜头后表面到焦点的距离。CONS:弧度转为角度。镜头相互嵌入,有错误。

weixin_72050316的博客 600

Java后端中的并发控制:从锁机制到无锁编程的实现

本文将通过对锁机制的深入介绍,并引入无锁编程的实现方式,帮助大家掌握并发编程中的核心技术。针对不同的应用场景,我们可以选择适合的并发控制方案,从而提高程序的并发性能和稳定性。在Java中,锁(Lock)是控制多线程并发的重要工具,它用于确保共享资源在同一时间只能被一个线程访问。,可以避免锁的使用,同时保证并发操作的原子性。在读多写少的场景中,传统的排它锁可能会造成大量线程的等待,因此Java提供了读写锁机制来优化这类场景。包中的锁,它提供了更灵活的锁机制,比如可中断锁等待、非阻塞锁获取等。

技术研究中心 836

AI摄影师:自动构图与修图算法设计

AI摄影师:自动构图与修图算法设计​ ,人工智能,计算机视觉,大模型,AI,AI 摄影师的核心能力体现在两方面:自动构图(通过算法优化画面元素布局)与智能修图(自动调整光影、色彩、细节)。例如,手机摄影中的 “AI 构图建议” 功能可实时框选最佳拍摄区域,修图软件中的 “一键增强” 能在 0.1 秒内完成专业级调色,这些都依赖于计算机视觉与深度学习的深度融合。

不踩坑,不知道坑有多深;不总结,踩过的坑白踩。 16万+

【数据集】1980-2020年(5年)土地利用分类数据-中国科学院

简介1980-2020年每五年土地利用数据-中国科学院

WW、forever的博客 3933

Java锁是什么?简单了解

通过上面的场景以及例子,我们可以了解多线程情况下,造成的变量值前后不一致的问题,以及锁的作用,在使用了锁以后,可以避免这种混乱的现象,后续,老猫会和大家介绍一个Java中都有哪些关于锁的解决方案,以及项目中所用到的实战。

fzlhz的博客 205

月薪2万+的网络工程师,到底藏着哪些“绝活”?

在IT圈,网络工程师是个既神秘又硬核的职业。月薪2万+的网工,早已不是只会拉网线、改IP的“IT民工”,而是掌握了一身“绝技”的技术大牛。他们能让企业网络如丝般顺滑,面对宕机临危不乱,还能用自动化脚本批量搞定上百台设备。想知道这些高薪网工的秘密武器是什么?今天,我就以一个老网工的视角,结合自己和同行们的实战经验,扒一扒那些月薪2万+的网络工程师都身怀哪些绝技。如果你也想挤进高薪行列,不妨参考参考!

网络技术联盟站 359

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...

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Java并发编程系列——锁:synchronized

锁是并发编程里保证数据线程安全的一个重要的工具。今天就来了解下,java里的锁。 如何实现一个高并发的计数器 我们首先来考虑一个问题,如何实现一个高并发的计数器。稍微了解过java的人应该立马能想到"synchronized"关键字。但是事实上,在Java里可以通过各种方式来实现线程安全的计数器。 这篇文字将会解锁以下几种方式,并详细的解锁每一种锁的机制。 synchronized Lock接口...

Tas的博客 308

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Java并发编程系列之十六:Lock锁

Lock锁简介Lock锁机制是JDK 5之后新增的锁机制,不同于内置锁,Lock锁必须显式声明,并在合适的位置释放锁。Lock是一个接口,其由三个具体的实现:ReentrantLock、ReetrantReadWriteLock.ReadLock 和 ReetrantReadWriteLock.WriteLock,即重入锁、读锁和写锁。增加Lock机制主要是因为内置锁存在一些功能上局限性。比如无法中

rhwayfun专栏 5362

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

java并发系列:锁的内存语义

一 序:  本文根据《Java并发编程的艺术》第3.5部分整理而成。书上的3.4 volatile 参见之前整理。 jdk里面Javadoc关于lock有这样的介绍:Memory SynchronizationAll Lock implementations must enforce the same memory synchronization semantics as provided by ...

bohu83的博客 2122

Java并发编程学习系列九:主流锁

Java锁学习 Java提供了种类丰富的锁,每种锁因其特性的不同,在适当的场景下能够展现出非常高的效率。本文旨在对锁相关源码(本文中的源码来自JDK 8和Netty 3.10.6)、使用场景进行举例,为读者介绍主流锁的知识点,以及不同的锁的适用场景。 Java中往往是按照是否含有某一特性来定义锁,我们通过特性将锁进行分组归类,再使用对比的方式进行介绍,帮助大家更快捷的理解相关知识。下面给出本文内容的总体分类目录: 乐观锁 VS 悲观锁 乐观锁与悲观锁是一种广义上的概念,体现了看待线程同步的不同角度。在Ja

Herishwater的博客 317

Java并发编程系列:锁优化

单核的并行算法的效率要低于原始串行的算法,因为并行多线程多了线程调度、上下文切换等开销。而单线程器主要资源都花在 任务本身,他不需要维护数据结构的一致性,也不需要为线程的切换和调度花费时间。并行计算之所以能提高系统的性能,而是因为他更合理的进行任务调度,充分利用各个CPU的资源,合理的并发,才能将CPU的性能发挥到极致。在高并发的环境下,激烈的所竞争会导致程序的性能下降。1.减少锁的持有时间在必要时

TheLudlows的博客 503

java高并发系列 - 第33篇:怎么演示公平锁和非公平锁?

这是java高并发系列第33篇文章。环境:jdk1.8。今天群里面刚有有人在问这块的东西,那就拿出来说一下。本文主要用juc中的ReentrantLock来说一下公平锁和...

路人甲Java 716

Java并发编程系列之四:锁与volatile的内存语义

前言在前面的文章中已经提到过volatile关键字的底层实现原理:处理器的LOCK指令会使得其他处理器将缓存刷新到内存中(确切说是主存)以及会把其他处理器的缓存设置为无效。这里的内存语义则说的是在JMM中的实现,那么为什么要理解volatile和锁在JMM中的内存语义呢?主要原因是这部分内容是与程序开发息息相关的,所以在高并发量的系统中,如果对这块知识的了解欠缺的话将无法设计出优雅支持高并发的系统(

rhwayfun专栏 2821

Java并发46:并发集合系列-基于锁分段技术的ConcurrentHashMap

[超级链接:Java并发学习系列-绪论] [系列序章:Java并发43:并发集合系列-序章] 原文地址:http://ifeve.com/concurrenthashmap/ 术语定义 术语 英文 解释 哈希算法 hash algorithm 是一种将任意内容的输入转换成相同长度输出的加密方式,其输出被称为哈希值。 哈希表 hash ...

韩超的博客 (hanchao5272) 1417

java 锁购票_java高并发系列 - 第33篇:怎么演示公平锁和非公平锁?

跟着阿里p7学并发,微信公众号:javacode2018*/@Slf4jpublic class Demo8 {public static void main(String[] args) throws InterruptedException {//非公平锁test1(false);TimeUnit.SECONDS.sleep(4);log.info("---------------------...

weixin_39586265的博客 140

Java并发编程系列之十二:死锁、饥饿和活锁

死锁发生在一个线程需要获取多个资源的时候,这时由于两个线程互相等待对方的资源而被阻塞,死锁是最常见的活跃性问题。这里先分析死锁的情形:假设当前情况是线程A已经获取资源R1,线程B已经获取资源R2,之后线程A尝试获取资源R2,这个时候因为资源R2已经被线程B获得了,所以线程A只能阻塞直到线程B释放资源R2。另一方面,线程B在已经获得资源R2的前提下尝试获取由线程A持有的资源R1,那么由于资源R1已经被

rhwayfun专栏 9572

java学习系列-高并发31:怎么演示公平锁和非公平锁?

先理解一下什么是公平锁、非公平锁? 公平锁和非公平锁体现在别人释放锁的一瞬间,如果前面已经有排队的,新来的是否可以插队,如果可以插队表示是非公平的,如果不可用插队,只能排在最后面,是公平的方式。 示例 测试公平锁和非公平锁的时候,可以这么来:在主线程中先启动一个t1线程,在t1里面获取锁,获取锁之后休眠一会,然后在主线中启动10个father线程去排队获取锁,然后在t1中释放锁代码的前面一步再启动一个线程,在这个线程内部再创建10个son线程,去获取锁,看看后面这10个son线程会不会排到上面10个fat

星之宇的博客 251

Java并发编程学习系列一:线程与锁

概念 什么是线程和进程? 进程是程序的一次执行过程,是系统运行程序的基本单位,因此进程是动态的。系统运行一个程序即是一个进程从创建,运行到消亡的过程。 在 Java 中,当我们启动 main 函数时其实就是启动了一个 JVM 的进程,而 main 函数所在的线程就是这个进程中的一个线程,也称主线程。 线程与进程相似,但线程是一个比进程更小的执行单位。一个进程在其执行的过程中可以产生多个线程。与进程不同的是,同进程下的线程共享进程的堆和方法区资源,但每个线程有自己的程序计数器、虚拟机栈和本地方法栈,所以系统在

Herishwater的博客 281
上一篇: 硬核破解HashMap源码
下一篇: 80W美团架构师轻量级框架SSM整合开发实战文档
Java技术那些事儿
博客等级 码龄5年 2306粉丝 2584原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值