文章目录

    • 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相关推荐

  1. Java锁详解:“独享锁/共享锁+公平锁/非公平锁+乐观锁/悲观锁+线程锁”

    在Java并发场景中,会涉及到各种各样的锁如公平锁,乐观锁,悲观锁等等,这篇文章介绍各种锁的分类: 公平锁/非公平锁 可重入锁 独享锁/共享锁 乐观锁/悲观锁 分段锁 自旋锁 线程锁 乐观锁 VS 悲 ...

  2. 最全Java锁详解:独享锁/共享锁+公平锁/非公平锁+乐观锁/悲观锁

    在Java并发场景中,会涉及到各种各样的锁,比如:高并发编程系列:4种常用Java线程锁的特点,性能比较.使用场景,这些锁有对应的种类:公平锁,乐观锁,悲观锁等等,这篇文章来详细介绍各种锁的分类: 公 ...

  3. Java 面试 :乐观锁 悲观锁

    乐观锁悲观锁,是为了解决多线程并发操作共享变量可能导致的脏读.幻读和不可重复读等问题 悲观锁 悲观锁,是因为这是一种对数据的修改持有悲观态度的并发控制方式.总是假设最坏的情况,每次读取数据的时候都默认 ...

  4. 可重入锁/不可重入锁,公平锁/非公平锁,乐观锁/悲观锁,独享锁/共享锁,偏向锁/轻量级锁/重量级锁,分段锁,自旋锁

    在并发编程中,会涉及到各种各样的锁,这篇文章主要介绍各种锁的分类以及作用. 介绍的内容如下: 可重入锁/不可重入锁 公平锁/非公平锁 乐观锁/悲观锁 独享锁/共享锁 偏向锁/轻量级锁/重量级锁 分段锁 ...

  5. 悲观锁的实现方式java_并发编程--锁--悲观锁和乐观锁

    悲观锁和乐观锁并不是某个具体的"锁"而是一种并发编程的基本概念,是根据看待并发同步的角度.乐观锁和悲观锁最早出现在数据库的设计当中,后来逐渐被 Java 的并发包所引入. 悲观锁 ...

  6. 常见锁策略—乐观锁悲观锁

    目录 1.乐观锁&悲观锁 1.1 乐观锁的定义 1.2 乐观锁的实现(CAS机制) 1.3 乐观锁存在的问题:ABA问题 1.4 悲观锁 2.公平锁&非公平锁 3.读写锁 4.独占锁& ...

  7. 常⻅锁策略(1. 乐观锁 悲观锁2. 公平锁 非公平锁3. 读写锁4. 可重入锁 自旋锁)

    目录 1. 乐观锁 & 悲观锁 1.1乐观锁定义 1.2 乐观锁实现 -- CAS 1.3 悲观锁定义和应⽤ 2. 公平锁 & 非公平锁 3. 读写锁 3.1 读写锁 3.2 独占锁 ...

  8. Django - ORM - 事务, 乐观锁, 悲观锁

    事务 概念 Transaction 事务:一个最小的不可再分的工作单元:通常一个事务对应一个完整的业务(例如银行账户转账业务,该业务就是一个最小的工作单元) 一个完整的业务需要批量的DML(inser ...

  9. Mysql之乐观锁悲观锁:乐观锁检查数据状态 悲观锁更新时锁定数据

    1.问题来源 就是一数据表的数据  在两个人同时修改的时候  会出现混乱 例子:如一个字段记录status=1 表示可以下单  货品只有1个的时候    a下单的同时b也下单 : a有修改status ...

  10. mysql默认乐观锁悲观锁_MySQL中悲观锁和乐观锁到底是什么?-阿里云开发者社区...

    索引和锁是数据库中的两个核心知识点,隔离级别的实现都是通过锁来完成的 按照锁颗粒对锁进行划分 ? 锁用来对数据进行锁定,我们可以从锁定对象的粒度大小来对锁进行划分,分别为行锁.页锁和表锁. 行锁就是按 ...

最新文章

  1. Sphinx-安装和配置
  2. Kafka为什么速度那么快?
  3. [转]样式篇之如何实现合并单元格效果
  4. InetAddressImpl#lookupAllHostAddr慢/挂起
  5. arrayPointer
  6. 文件系统应用笔记之一:FatFS在STM32F4上的移植
  7. 截止2020年06月06日证书获得
  8. 为什么使用getrequestdispatcher跳转出现404_网站出现404错误时的处理方法
  9. phpinfo 有imagick php artisan 没有_WordPress 上传图片时 async-upload.php出现520 Bug的原因及解决方案...
  10. 从零开始学习python编程-Python3.5从零开始学 PDF 下载
  11. CentOS7安装python3.6.6(解决所有安装异常情况!!!)
  12. python的标准库——turtle
  13. 计算机电脑五笔怎么打,卸五笔怎么打_电脑极品五笔输入法卸载方法介绍
  14. 在matlab中读取二进制文件
  15. python中interval函数_python强大的区间处理库interval用法介绍
  16. wgs84 转百度地图坐标
  17. python五角星程序显示错误_python画五角星和六角星程序
  18. 基于SpringBoot+Vue20小时打造高考志愿填报辅助系统
  19. 英特尔OpenVINO工具套件快速构建一款AI应用之课程体验
  20. LABVIEW学习之(1)读和写EXCEL

热门文章

  1. Excel文件减肥修复终极办法----解决Excel文件打开慢的问题
  2. 2tb的硬盘容量在计算机中识别的容量为,硬盘容量限制又来了,用2T以上硬盘的要注意了...
  3. 专升本高数——第二章 一元函数的导数与微分【学习笔记】
  4. channel使用法则
  5. python学习-获取时光网电影TOP100电影信息
  6. SpringBoot 无法捕获 maximum upload size exceeded
  7. 古训:能控制早晨的人,方可控制人生(经典)
  8. 交互媒体专题设计大作业
  9. dede列表分页php,织梦分页列表样式的修改dedepagelist
  10. 英译中练习:准译员如何“假装”自己很专业?丨打死个翻译官2.3