当前位置:网站首页>并发概念基础:线程安全与线程间通信
并发概念基础:线程安全与线程间通信
2022-08-04 05:32:00 【real沛林】
线程安全
按照线程安全的安全程度来分的话,java中的各种操作共享的数据主要分为5类:不可变、绝对线程安全、相对线程安全、线程兼容和线程对立。
- 不可变
对于final关键字可见性来说,只要一个不可变对象被正确构建出来(没有this引用逃逸),那其外部的可见状态永远也不会改变。
在java api中复核不可变要求的类型主要有:- String
- 枚举类型
- Long和Double等数值包装类型
- BigInteger和BigDecimal等大数据类型
但同在number包下的AtomicLong和AtomInteger等原子类并非是不可变的类型。
- 绝对线程安全
java中几乎没有 - 相对线程安全
这个就是我们通常意义所说的线程安全。
它需要保证对这个对象单独的操作时线程安全的,我们在调用的时候不需要做额外的保障措施。但是对于一些特定顺序的连续调用,就可能需要在调用端使用额外的同步手段来保证调用的正确性。
如vector,hashtable等线程安全类都是属于这种的。 - 线程兼容
线程兼容是指对象本身并不是线程安全的,但是可以通过在调用端正确使用同步手段来保证对象在并发环境中可以安全使用。
java中的ArrayList和HashMap就是这种。 - 线程对立
指无论调用端是否采用同步措施,都无法在多线程环境中并发使用代码。
一个例子就是Thread类的suspen方法和resume方法,如果有两个线程同时持有一个线程对象,一个去中断线程,一个去恢复线程,如果并发进行的话,无论调用是否采用了同步,都会存在锁死的风险。
常见的线程对立例子还有:
System.setIn()
System.setOut()
System.runFinalizersOnExit()
线程安全的实现方法
参考并发等级
线程间通信
https://www.cnblogs.com/yangdagaoge/articles/9685023.html
volatile和synchronized
wait/notify 机制
管道输入/输出流
Thread.join()
ThreadLocal的使用
边栏推荐
猜你喜欢
随机推荐
const int * a 与 int * const a 的定义与区别
线性表之动态数组(ArrayList)的自实现
动态内存管理-C语言
Question 1000: Input two integers a and b, calculate the sum of a+b, this question is multiple sets of test data
管道重定向
LeetCode_22_Apr_4th_Week
Janus转发丢包导致音视频不同步原因分析
位段-C语言
淘宝分布式文件系统存储引擎(一)
【HIT-SC-MEMO6】哈工大2022软件构造 复习笔记6
arm学习-1-开发板
调用时序错误导致webrtc无法建立链接
ideal life
LeetCode_Dec_2nd_Week
MySQL基础
集合--LinkedList
[daily office][ssh]cheatsheet
【c语言】整数的二进制表现形式是什么?
理想的生活
webrtc代码解读一:音频数据的接收解码播放过程