《Java并发编程实战》第2章-线程安全性

0.概念理解

对象状态 :存储在状态变量(例如实例或静态域)中的数据;
线程安全性 :当多个线程访问某个类时,这个类始终都能表现出正确的行为,那么就称这个类是线程安全的;
竞态条件 :针对一段有多个操作逻辑的代码,不恰当的线程执行时序可能导致不正确的结果的情况;
不变性条件:涉及多个变量时,各个变量之间并不是彼此独立的,而是某个变量的值会对其他变量的值产生约束。

1.什么情况下会面临线程安全性问题?

多个线程需要访问同一组数据,以达到多线程协作的目的时。

2.线程安全性涉及哪些问题?

原子性: 非原子性的操作序列执行结果可能因线程调度执行的顺序不同而得到不一致的结果;
可见性: A线程写入的数据可能不能立即被B线程正确地读取到;
有序性: 程序执行时可能因指令重排并不严格按照代码编写顺序执行(只保证单线程下多次执行结果一致)。

3.要保证线程安全性有哪些工具可用?

sychronized(可见性+原子性),volatile(可见性),显式锁(可见性+原子性),原子变量(可见性+原子性)。

其他需要注意的问题
  • 完全由线程安全类构成的程序不一定是线程安全的,线程安全类中也可以包含非线程安全的类;
  • 只有当类中仅包含自己的状态时,线程安全类才是有意义的;
  • 无状态对象一定是线程安全的;
  • 常见的竞态条件是先检查后执行,通过一个可能失效的观测结果来决定下一步的动作;
  • 要保持状态一致性,就需要在单个原子操作中更新所有相关的状态变量
  • 内置的sychronized锁是可重入的,场景:子类重写父类的sychronized方法并调用父类的方法;
  • 在不变性条件中的每个变量都必须由同一个锁来保护;
  • 多个原子性操作的组合使用需要额外加锁
  • 同步代码的执行时间应当尽可能短,把耗时长的代码剥离出去。
相关推荐
毕设源码-赖学姐6 分钟前
【开题答辩全过程】以 基于Java的游泳馆会员管理系统的设计与实现为例,包含答辩的问题和答案
java·开发语言
侠客行031722 分钟前
Tomcat 网络I/O模型浅析
java·tomcat·源码阅读
Yilena23 分钟前
带你轻松学习LangChain4j
java·学习·langchain
皙然41 分钟前
深入拆解MESI协议:从原理到实战,搞懂CPU缓存一致性的核心机制
java·缓存
郝学胜-神的一滴41 分钟前
【技术实战】500G单行大文件读取难题破解!生成器+自定义函数最优方案解析
开发语言·python·程序人生·面试
愤豆1 小时前
02-Java语言核心-语法特性-注解体系详解
java·开发语言·python
2301_822782821 小时前
自动化与脚本
jvm·数据库·python
是翔仔呐1 小时前
第13章 SPI通信协议全解:底层时序、4种工作模式与W25Qxx Flash芯片读写实战
c语言·开发语言·stm32·单片机·嵌入式硬件·学习·gitee
qq_148115371 小时前
为你的Python脚本添加图形界面(GUI)
jvm·数据库·python
2401_878530211 小时前
自定义内存布局控制
开发语言·c++·算法