Java 锁 概念介绍
一 Java中的锁是什么?
/*
* 一 Java锁定义?
* 在计算机科学中,锁(lock)或互斥(mutex)是一种同步机制,用于在有许多执行线程的环境中强制对资源的访问限制。
* 锁旨在强制实施互斥排他、并发控制策略。
*
* 锁的宏观分类?
* 乐观锁 和 悲观锁。
*
* 二 乐观锁?
* 即认为读多写少,遇到并发写的可能性低,每次去拿数据的时候都认为
别人不会修改,所以不会上锁。 版本号机制 和 CAS算法 来实现乐观锁。
但是在更新的时候会判断一下在此期间别人有没有去更新这个数
据,采取在写时 先读出【当前版本号】,然后加锁操作(比较跟上一次的版本号,如果一样则更新),
如果失败则要重复读-比较-写的操作 案例 银行卡 理想型 事物之间不干扰。 事件一 进账
本人银行卡,到月发工资。 此时版本号1
余额 0 , 到账1000, 结束。 整个过程只有新增的一条记录
完成后 版本号 + 1 此时版本号2 事件二 消费
银行卡支付账单,查询余额,此时版本号2
有1000 元 ,扣除消费金额10元
余额 990元 此时版本号3 事件之间互相干扰
事件一和二,同时开始。
版本号都从1开始
让事件一完成,此时的版本号是2
事件二开始,事件二会对版本号进行比较,此时版本号不一致。事件二就会失败。
然后重复读---比较----写的操作。 cas算法? 比较替换。
是一种更新的原子性操作,比较当前的值,和传入的值是否一致性。 一样则更新,否则失败。 CAS利用CPU指令【调用的是本地方法】,从硬件层面保证了操作的原子性,
原语的执行必须是连续的。不存在线程切换的问题。以达到类似于锁的效果。 无锁操作,不可能出现死锁情况。 cas(v,e,n) 想把v 修改成n ,需要v和e 进行比较,二者相同,才跟新变量v,然后把v的值给赋值给新值n。
v 需要更新的变量
e 预期值
n 新值 我们提供一个期望值 e ,当他和v 就是需要更新的变量是相等的。说明还没有线程修改该值。可以执行cas操作。
反之,期望值和需要更新的变量不相等。说明已经被其他线程修改。就不执行更新操作。
可以重新读取该变量,尝试再次修改,也可以放弃操作。 cas bba问题?
对应一个版本号,一个数据一个版本,值相等,版本号相等,才能修改。 三 悲观锁 Synchronized
悲观锁(Pessimistic Lock), 做最坏的打算来处理问题,每次去拿数据的时候都认为别人会修改。
所以每次在拿数据的时候都会上锁。这样别人想拿数据就被挡住,直到悲观锁被释放。 四 区别?
悲观锁阻塞事务,乐观锁回滚重试,
它们各有千秋,取决于实际使用场景。 像乐观锁适用于写比较少的情况下,冲突很少发生的时候,这样可以省去锁的开销,加大了系统的整个吞吐量。
但如果经常产生冲突,上层应用会不断的进行重试,这样反倒是降低了性能,所以这种情况下用悲观锁就比较合适。 *
*
*
*
*/
Java 锁 概念介绍的更多相关文章
- Java基础之(一)——从synchronized优化看Java锁概念
一.悲观锁和乐观锁概念 悲观锁和乐观锁是一种广义的锁概念,Java中没有哪个Lock实现类就叫PessimisticLock或OptimisticLock,而是在数据并发情况下的两种不同处理策略. 针 ...
- Java锁概念基础
Java中的锁不管是Lock还是synchronized都可以分为互斥锁和非互斥锁. 互斥锁只能被一个线程持有,其他线程只能等待锁的释放.synchronized,ReentrantLock,Read ...
- java 并发多线程 锁的分类概念介绍 多线程下篇(二)
接下来对锁的概念再次进行深入的介绍 之前反复的提到锁,通常的理解就是,锁---互斥---同步---阻塞 其实这是常用的独占锁(排它锁)的概念,也是一种简单粗暴的解决方案 抗战电影中,经常出现为了阻止日 ...
- java中锁的概念/介绍
前言 Java提供了种类丰富的锁,每种锁因其特性的不同,在适当的场景下能够展现出非常高的效率.本文旨在对锁相关源码(本文中的源码来自JDK 8和Netty 3.10.6).使用场景进行举例,为读者介绍 ...
- java 并发多线程显式锁概念简介 什么是显式锁 多线程下篇(一)
目前对于同步,仅仅介绍了一个关键字synchronized,可以用于保证线程同步的原子性.可见性.有序性 对于synchronized关键字,对于静态方法默认是以该类的class对象作为锁,对于实例方 ...
- java锁与监视器概念 为什么wait、notify、notifyAll定义在Object中 多线程中篇(九)
在Java中,与线程通信相关的几个方法,是定义在Object中的,大家都知道Object是Java中所有类的超类 在Java中,所有的类都是Object,借助于一个统一的形式Object,显然在有些处 ...
- Java基础加强之并发(一)基本概念介绍
基本概念介绍 进程:它是内存中的一段独立的空间,可以负责当前应用程序的运行.当前这个进程负责调度当前程序中的所有运行细节. 线程:它是位于进程中,负责当前进程中的某个具备独立运行资格的空间. 进程是负 ...
- java中的各种锁详细介绍
转自:https://blog.csdn.net/axiaoboge/article/details/84335452 Java提供了种类丰富的锁,每种锁因其特性的不同,在适当的场景下能够展现出非常高 ...
- Java SE/ME/EE的概念介绍
转自 Java SE/ME/EE的概念介绍 多数编程语言都有预选编译好的类库以支持各种特定的功能,在Java中,类库以包(package)的形式提供,不同版本的Java提供不同的包,以面向特定的应用. ...
随机推荐
- 第四十二个知识点:看看你的C代码为蒙哥马利乘法,你能确定它可能在哪里泄漏侧信道路吗?
第四十二个知识点:看看你的C代码为蒙哥马利乘法,你能确定它可能在哪里泄漏侧信道路吗? 几个月前(回到3月份),您可能还记得我在这个系列的52件东西中发布了第23件(可以在这里找到).这篇文章的标题是& ...
- Variational Inference with Normalizing Flow
目录 概 主要内容 一些合适的可逆变换 代码 Rezende D., Mohamed S. Variational Inference with Normalizing Flow. ICML, 201 ...
- MCMC using Hamiltonian dynamics
目录 算法 符号说明 Hamilton方程 物理解释 一些性质 可逆 Reversibility H的不变性 保体积 Volume preservation 辛 Symplecticness 离散化H ...
- 使用 DML语句,对 “锦图网” 数据进行操作,聚合函数练习
查看本章节 查看作业目录 需求说明: 根据客户 ID 统计订单数.订单总金额.最高订单金额.最低订单金额和每份订单平均金额,并按订单总金额升序显示 根据客户统计订单总订购人次数> 5 的统计信息 ...
- Windows实现桌面录屏、指定窗口录制直播,低延时,H5页面播放
接着前面记录的3种方式实现桌面推流直播: 1.Windows 11实现录屏直播,搭建Nginx的rtmp服务 的方式需要依赖与Flash插件,使用场景有限 2.Windows 11实现直播,VLC超简 ...
- docker查看容器的ip地址
查看Docker的底层信息. docker inspect 会返回一个 JSON 文件记录着 Docker 容器的配置和状态信息 # 列出所有容器的IP地址docker inspect --forma ...
- vue-router 两个子路由之间相互跳转时出错
patient页面跳转到apply页面后,再点击patient页面后无法跳回 解决方法:使用`${path + path1}` 来自为知笔记(Wiz)
- Python实战案例系列(一)
本节目录 烟草扫码数据统计 奖学金统计 实战一.烟草扫码数据统计 1. 需求分析 根据扫码信息在数据库文件中匹配相应规格详细信息,并进行个数统计 条码库.xls 扫码.xlsx 一个条码对应多个规格名 ...
- Servlet初级学习加入数据库操作(三)
源代码地址(访问密码:7567):https://url56.ctfile.com/f/34653256-527822631-2e255a CRUD 增删改查 准备添加的操作 点击添加之后,出现新的页 ...
- php中使用CURL之php curl详解
curl是个什么东西?简单地说就是,curl是一个库,能让你通过URL和许多不同种的服务器进行勾搭.搭讪和深入交流,并且还支持许多协议.并且人家还说了curl可以支持https认证.http post ...