Java 并发
May 21, 2019•106 words
并发问题的核心
在并发编程领域要解决的三个核心问题: 分工,同步,互斥
分工: 将任务分解,进行执行典型的有生产者-消费者模型
同步:分工好之后任务之间需要协作,需要通信,线程的执行顺序等问题都要解决
互斥:同一时刻只允许一个线程访问共享资源,否则将引起混乱。锁的实现保证等
并发问题源头
1. 可见性
随着多核 CPU 的发展,缓存机制的引入,这就导致了主存中的变量或者数据同时存在于多个 CPU 的缓存中,这就导致了多个线程间数据的可见性问题。
2.原子性
CPU 在进行线程切换的时候采用时间片轮换方式,当一个线程A 的时间片用完但是线程任务未执行完,CPU 使用权被交给另外一个线程 B,此时 B按照相同的代码逻辑从 内存加载数据,执行操作,写回内存执行完毕。此时 A 又回来开始执行未执行完的操作,这时 A 所操作的那份数据的拷贝对内存数据来说已经为老版本了,在此数据上继续操作将覆盖掉 B 所做的更新,导致不期望的执行结果。上述的操作就破坏了原子性,当一个或多个操作在 CPU 执行过程中不被中断的特性称为原子性。
3.有序性
有序性问题常源自编译器优化带来的指令重...
Read post