【学习笔记-并发编程实战】第2章 线程安全性

 什么是线程安全性

要搞清线程安全性的定义,书上说最核心的概念是“正确性”,所谓“正确性”,我感觉就是一段代码执行的确定性,类的代码能够正确的工作。当多个线程访问某个类、某个方法时,都能表现出确定的行为,能够预知的行为,这就是线程的安全性。

 

原子性

原子性应该就比较好理解了,正如其义,原子,不可分割(如果原子可以被分割为夸克,那就是夸克性吧)。一段代码块块或者一个方法,不可以被cpu分割成多步执行,中间没有时间片的切换,应该就是这个意思。

竞态条件

存在一个条件,导致程序在“先检查后执行”和“读取-修改-写入”的操作前后状态不一致,中间被切断分割。代码中如果有这种不确定的条件,就会导致线程在执行代码时不能确定类的正确性。

复合操作

刚才说到的“先检查后执行”需要两个步骤,“读取-修改-写入”需要三个步骤,需要进行多个步骤的操作。

 

加锁机制

复合操作有可能会被cpu分片执行,就不能保证相关状态的确定性了,从而导致程序线程不安全,如何确保类的线程安全呢,使用加锁机制可以解决

内置锁

使用synchronized的关键字将需要执行的复合操作放在同一个synchronized代码块中,这样,这个代码块中的代码就具有了原子性,在执行的过程中会被当做一个整体,不会被分割(不会分割的原理是因为被设置的锁锁住了,导致其他线程无法分割,其他线程获取cpu时间后也不能进行执行)。

程序执行到synchronized之前获得一个锁,一个可重入、互斥的内置锁

 

用锁来保护状态

一个需要共享的变量,在访问他时都需要持有一个锁,这样保证多线程访问时变量是安全的。需要保护的变量最后只由一个锁来进行保护,能够最大化的利于维护人员的维护。

活跃性与性能

如果将需要执行的大段代码都放置在的同一个加锁的代码块中,由于互斥的原因,导致一线程在执行的时候,其他线程无法正常进入执行,只能等待,从和宏观一点的角度看,代码的执行效率变低了。

为了提高效率,通过将加锁的代码块分割成多个加锁的代码块,从而取得安全性与性能上的平衡。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值