synchronizedReentrantLock乐观锁悲观锁(Java线程安全实现)JVM9
文章目录
- Java语言的线程安全
- 线程安全实现
- 2、非阻塞同步
- 乐观并发策略硬件实现
- 无同步方案
Java语言的线程安全
1、不可变
2、相对线程 安全
3、相对线程安全
4、线程兼容
5、线程对立
线程安全实现
1、互斥同步
保持共享数据在同一时刻只被一条线程使用 互斥是实现同步的一种手段 临界区 互斥量和信号量
synchronized 关键字
synchronized关键字javac编译之后同步前后分别形成monitorenter 和monitorexit 两个字节码指令
(1)sychronized修饰的同步块对同一条线程来说是可重入的
(2)被synchronized修饰的同步块在持有锁的过程执行完成 释放锁之前 会无条件阻塞直到后面的线程进入
持有锁是一个是一个重量级操作
synchronized中的锁事非公平的
优先使用:
synchronized 是在java 语法层面的同步 足够清晰
Lock 应该确保在finally释放锁
ReentrantLock
是lock 接口最常见的一种实现
是可重入 一般具有高级功能
主要有以下三项:
等待可中断
可实现公平锁
锁可以绑定多个条件
(1)等待可中断: 是指在长期不释放锁的时候 正在等待的线程可以选择放弃等待 该位处理其他事情 可以中断特性对处理执行时间非常长的同步块
(2)公平锁:是指多个线程等待同一锁,必须按照申请锁的时间顺序来一次获取锁
ReentrantLock默认是非公平锁(在锁释放时 任何一个等待锁的线程都有机会获得锁)
(3)锁绑定多个条件:一个ReentrantLock对象可以同时绑定多个Condition对象
2、非阻塞同步
互斥同步 面临的问题是 进行线程阻塞和唤醒所带来的性能开销
这种同步也被称之为阻塞线程
悲观锁:总是认为不加锁就肯定会出现问题 无论共享的数据是否真的会出现竞争 他都会进行加锁 会导致用户态到核心态的转换、维护锁计数器和检查是否有被组设的线程需要被唤醒等开销
解决方法:基于冲突检测的乐观并发策略
就是当没有线程争夺的时候 会进行 直接操作 会进行时间戳标记
当有线程争夺,时间戳会改变 做重试 直到没有共享数据被争夺为止
这种策略不用将线程挂起被称为非阻塞同步称之为 无锁编程
乐观并发策略硬件实现
·测试并设置
·获取并增加
·交换
·比较并交换 CAS
·加载链接/条件存储
无同步方案
保证线程安全 并非一定要进行阻塞或非阻塞同步 同步和线程同步两者之间没有必然联系 同步只是保证存在数据征用时 正确手段,有一些天生代码安全
可重入代码:这种代码成为纯代码 是可以执行的任何时刻中断它,转而去执行另一段代码而控制权返回时,原来的程序不会出现任何错误,也不会对程序结果有所影响
特征:
不依赖全局变量
存储在堆上的数据和公用的系统资源
用到的状态量由参数传入
不调用非可重入的方法
线程本地存储:
如果一段代码中所需要的数据必须与其他代码共享 那就看看这些共享数据的代码能否保证在同一线程中执行 如果能保证 我们就可以把共享数据的可见范围现在同一线程中 这样无须同步也能保证线程之间不出现线程争取用的问题
synchronizedReentrantLock乐观锁悲观锁(Java线程安全实现)JVM9相关推荐
- Java锁详解:“独享锁/共享锁+公平锁/非公平锁+乐观锁/悲观锁+线程锁”
在Java并发场景中,会涉及到各种各样的锁如公平锁,乐观锁,悲观锁等等,这篇文章介绍各种锁的分类: 公平锁/非公平锁 可重入锁 独享锁/共享锁 乐观锁/悲观锁 分段锁 自旋锁 线程锁 乐观锁 VS 悲 ...
- 最全Java锁详解:独享锁/共享锁+公平锁/非公平锁+乐观锁/悲观锁
在Java并发场景中,会涉及到各种各样的锁,比如:高并发编程系列:4种常用Java线程锁的特点,性能比较.使用场景,这些锁有对应的种类:公平锁,乐观锁,悲观锁等等,这篇文章来详细介绍各种锁的分类: 公 ...
- Java 面试 :乐观锁 悲观锁
乐观锁悲观锁,是为了解决多线程并发操作共享变量可能导致的脏读.幻读和不可重复读等问题 悲观锁 悲观锁,是因为这是一种对数据的修改持有悲观态度的并发控制方式.总是假设最坏的情况,每次读取数据的时候都默认 ...
- 可重入锁/不可重入锁,公平锁/非公平锁,乐观锁/悲观锁,独享锁/共享锁,偏向锁/轻量级锁/重量级锁,分段锁,自旋锁
在并发编程中,会涉及到各种各样的锁,这篇文章主要介绍各种锁的分类以及作用. 介绍的内容如下: 可重入锁/不可重入锁 公平锁/非公平锁 乐观锁/悲观锁 独享锁/共享锁 偏向锁/轻量级锁/重量级锁 分段锁 ...
- 悲观锁的实现方式java_并发编程--锁--悲观锁和乐观锁
悲观锁和乐观锁并不是某个具体的"锁"而是一种并发编程的基本概念,是根据看待并发同步的角度.乐观锁和悲观锁最早出现在数据库的设计当中,后来逐渐被 Java 的并发包所引入. 悲观锁 ...
- 常见锁策略—乐观锁悲观锁
目录 1.乐观锁&悲观锁 1.1 乐观锁的定义 1.2 乐观锁的实现(CAS机制) 1.3 乐观锁存在的问题:ABA问题 1.4 悲观锁 2.公平锁&非公平锁 3.读写锁 4.独占锁& ...
- 常⻅锁策略(1. 乐观锁 悲观锁2. 公平锁 非公平锁3. 读写锁4. 可重入锁 自旋锁)
目录 1. 乐观锁 & 悲观锁 1.1乐观锁定义 1.2 乐观锁实现 -- CAS 1.3 悲观锁定义和应⽤ 2. 公平锁 & 非公平锁 3. 读写锁 3.1 读写锁 3.2 独占锁 ...
- Django - ORM - 事务, 乐观锁, 悲观锁
事务 概念 Transaction 事务:一个最小的不可再分的工作单元:通常一个事务对应一个完整的业务(例如银行账户转账业务,该业务就是一个最小的工作单元) 一个完整的业务需要批量的DML(inser ...
- Mysql之乐观锁悲观锁:乐观锁检查数据状态 悲观锁更新时锁定数据
1.问题来源 就是一数据表的数据 在两个人同时修改的时候 会出现混乱 例子:如一个字段记录status=1 表示可以下单 货品只有1个的时候 a下单的同时b也下单 : a有修改status ...
- mysql默认乐观锁悲观锁_MySQL中悲观锁和乐观锁到底是什么?-阿里云开发者社区...
索引和锁是数据库中的两个核心知识点,隔离级别的实现都是通过锁来完成的 按照锁颗粒对锁进行划分 ? 锁用来对数据进行锁定,我们可以从锁定对象的粒度大小来对锁进行划分,分别为行锁.页锁和表锁. 行锁就是按 ...
最新文章
- Sphinx-安装和配置
- Kafka为什么速度那么快?
- [转]样式篇之如何实现合并单元格效果
- InetAddressImpl#lookupAllHostAddr慢/挂起
- arrayPointer
- 文件系统应用笔记之一:FatFS在STM32F4上的移植
- 截止2020年06月06日证书获得
- 为什么使用getrequestdispatcher跳转出现404_网站出现404错误时的处理方法
- phpinfo 有imagick php artisan 没有_WordPress 上传图片时 async-upload.php出现520 Bug的原因及解决方案...
- 从零开始学习python编程-Python3.5从零开始学 PDF 下载
- CentOS7安装python3.6.6(解决所有安装异常情况!!!)
- python的标准库——turtle
- 计算机电脑五笔怎么打,卸五笔怎么打_电脑极品五笔输入法卸载方法介绍
- 在matlab中读取二进制文件
- python中interval函数_python强大的区间处理库interval用法介绍
- wgs84 转百度地图坐标
- python五角星程序显示错误_python画五角星和六角星程序
- 基于SpringBoot+Vue20小时打造高考志愿填报辅助系统
- 英特尔OpenVINO工具套件快速构建一款AI应用之课程体验
- LABVIEW学习之(1)读和写EXCEL
热门文章
- Excel文件减肥修复终极办法----解决Excel文件打开慢的问题
- 2tb的硬盘容量在计算机中识别的容量为,硬盘容量限制又来了,用2T以上硬盘的要注意了...
- 专升本高数——第二章 一元函数的导数与微分【学习笔记】
- channel使用法则
- python学习-获取时光网电影TOP100电影信息
- SpringBoot 无法捕获 maximum upload size exceeded
- 古训:能控制早晨的人,方可控制人生(经典)
- 交互媒体专题设计大作业
- dede列表分页php,织梦分页列表样式的修改dedepagelist
- 英译中练习:准译员如何“假装”自己很专业?丨打死个翻译官2.3