JVM学习(八):线程安全
1、线程安全:当多个线程访问一个对象时,如果不用考虑这些线程在运行时环境下的调度和交替执行,也无需进行额外的同步,或者在调用方进行任何其他的协调操作,调用这个对象的行为都可以获得正确的结果,那这个对象就是线程安全的。
2、线程安全的等级(由强到弱依次如下):
(1)不可变:不可变(Immutable)对象一定是线程安全的。如用final修饰的基本数据类型、String、枚举类以及java.lang.Number的部分子类(Long、Double等包装类,但AtomicInteger和AtomicLong并非不可变)。
(2)绝对线程安全:Java API中标注自己是线程安全的类,大多数都不是绝对线程安全。比如Vector容器,在同时做删除元素和获取元素的操作时,需要额外进行同步处理,才能真正做到线程安全。
(3)相对线程安全:即我们通常意义上所讲的线程安全,它需要保证对这个对象单独的操作是线程安全的,但对于一些特定顺序的连续调用,需要使用额外的同步措施才能保证调用结果的正确性。Java中比如Vector、HashTable、Collections的synchronizedCollection()方法包装的集合等都属于相对线程安全。
(4)线程兼容:对象本身不是线程安全,需要额外的同步手段来保证并发执行的安全,比如ArrayList和HashMap等集合类。
(5)线程对立:线程不安全,无论如何都不能在并发环境下保证线程安全的情况,很少出现,应尽量避免。比如已经废弃的中断线程的suspend()方法和恢复线程的resume()方法。
3、线程安全的实现方法:
(1)互斥同步:基于悲观并发策略实现的阻塞同步,同步是指在多个线程并发访问共享数据时,保证共享数据在同一时刻只被一个(或一些,使用信号量的时候)线程使用。临界区、互斥量和信号量都是主要的互斥实现方式,互斥是方法,同步是目的。Java中实现互斥同步的手段有使用synchronized关键字和使用J.U.C包中的重入锁(ReentrantLock)等。
(2)非阻塞同步:基于冲突检测的乐观并发策略,先对共享数据进行操作,如果发现没有竞争则操作成功,有就采取补偿措施(通常就是不断的重试,直至成功),操作和冲突检测必须具备原子性,需要硬件指令集的支持,比如CAS指令。
(3)无同步方案:不涉及共享数据,则无需同步,本身就支持线程安全,比如可重入代码或者线程本地存储(ThreadLocal)。
原文地址:https://www.cnblogs.com/xy80hou/p/11407145.html
- MySQL备份恢复第一篇(r5笔记第5天)
- 经典面试问题: Top K 之 -- 海量数据找出现次数最多或,不重复的
- Java多线程详解4【面试+工作】
- Java多线程详解5【面试+工作】
- Java多线程详解6【面试+工作】
- MySQL备份恢复第二篇(r5笔记第6天)
- SpringMVC 中配置 Swagger 插件.
- MySQL和Oracle对比学习之事务(r5笔记第4天)
- 【面试宝典】Java如何打印数组
- MySQL数据导入导出牛刀小试(r5笔记第3天)
- SpringMVC 异常处理.
- 一条简单的sql在11g和12c中的不同(r5笔记第2天)
- 浅析 SpringMVC 原理和配置.
- 使用impdp不当导致的数据丢失问题(r5笔记第1天)
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- 树莓派基础实验33:TCRT5000红外循迹传感器实验
- 10W个Java对象有多大
- 一次线程池引发的线上故障分析
- dubbo 启动Failed to save registry store file报错
- 大数据的列式存储格式:Parquet
- springBoot 入门(六)—— 整合Spring框架开启自带的任务调度器执行任务(注解方式)
- java字节流入门(缓冲输出流)
- EsotericSoftware Kryo —— 官方(1)
- Java的I/O类库的基本架构一句话介绍
- 树莓派综合项目1:智能温度测量系统实验
- 一句话ListenableFuture简介
- Google Guava Cache 使用
- Linux下安装maven3.6.2遇到的问题
- Unity3D网络通讯(五)--Socket通讯之Udp通讯
- IP不能作为rocketmq 的topic