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提供不同的包,以面向特定的应用. ...
随机推荐
- 【LeetCode】676. Implement Magic Dictionary 解题报告(Python & C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 字典 汉明间距 日期 题目地址:https://le ...
- computer(hdu2196)
Computer Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Su ...
- 【Java例题】3.3 正整数分解
3.将一个正整数分解为连续多个正整数之和. 例如: 15=1+2+3+4+5 15=4+5+6 15=7+8 package chapter3; import java.util.*; public ...
- Java_Swing中关于关闭窗口的方法
注意:在继承Jframe的过程中,由于工具的快捷功能可以会继承到Frame类,继承到Jframe类打开的窗口默认是可以关闭的,而Frame类打开的窗口点了关闭的没有反应的. 1.关闭子窗口后,父窗口也 ...
- 【跨域】SpringBoot跨域,拦截器中,第一次获取的请求头为NULL,发送两次请求的处理方式
背景: 在做前后端分离时,牵扯到跨域,但是已经设置了跨域 前端设置了允许携带Cookie axios.defaults.withCredentials = true; 后端也配置了跨域 浏览器端查看发 ...
- golang mongodb 驱动二次封装
mongodb 官方的go驱动包 go.mongodb.org/mongo-driver 使用起来比较繁琐,最近对其进行了二次封装 github地址:https://github.com/w3liu/ ...
- 建造者模式(python)
建造者模式将复杂对象的构建与其表示分离.建造者模式主要有两个参与者:建造者(builder)和指挥者(director) 来自为知笔记(Wiz)
- vi中使用鼠标右键插入时进入(insert)visual模式
使用vim插入外面复制的内容时,用右键点击后,并未将内容粘贴进去,而是进入了(insert)visual模式,解决方法:先shift+enter进入普通模式输入 set mouse-=a然后再i进入i ...
- Go语言系列- Socket编程和Redis
Socket编程 一.socket编程概述 什么是socket编程? socket编程是计算机PC机器上2个程序通过一个双向的通信连接实现数据的交互,这个连接的一端就是一个socket.socket的 ...
- Java语言学习案例雷霆战机
1.Java雷霆战机学习笔记(一)-资源加载 https://www.toutiao.com/i6631331313259381255/ 2.Java雷霆战机学习笔记(二)-音乐播放 https:// ...