在并发编程中,需要注意的问题很多,主要有以下三个方面的问题,分别是安全性问题、活跃性问题和性能问题。
安全性问题
经常说的线程安全,何为线程安全,其本质上就是正确性,而正确性的含义就是程序按照我们的期望执行。
存在共享数据并且该数据会发生变化,通俗地讲就是有多个线程会同时读写同一数据会导致安全性问题,
多个线程并发读写统一数据,叫做数据竞争(Data Race),
竞态条件(Race Condition),指的是程序的执行结果依赖线程执行的顺序
还是不懂。。。。。。
那面对数据竞争和竞态条件问题,又该如何保证线程的安全性呢?其实这两类问题,都可以用互 斥这个技术方案,而实现互斥的方案有很多,CPU 提供了相关的互斥指令,操作系统、编程语言 也会提供相关的 API。从逻辑上来看,我们可以统一归为:锁
活跃性问题
所谓活跃性问题,是指某个操作无法执行下去。死锁就是一个典型的活跃性问题。除了死锁,还有“活锁”和“饥饿”
性能问题
使用锁会将操作串行化,另外获取锁和释放锁两个操作也需要计算资源和等待,会降低程序性能。
解决方案
- 使用无所的算法和数据结构,比如Thread Local, Copy on Write,乐观锁,自旋+CAS等
- 减少锁持有的时间,比如使用更细粒度的锁
网友评论