并发——原子性、可见性、有序性 &&(volatile关键字)

原子性:一个操作不会被打断,要么一次完成,要么不做。

原子操作:不可被分割的操作

如果一个线程在访问一个共享资源时是可重入状态的,那么这个线程处理是不安全的,存在多个线程争抢访问同一资源的情况,这个数据就会存在二义性(不是实际我们想要的处理结果)。所以多个线程操作共享资源时应对让多个线程访问同一把互斥锁,当访问资源时先获取锁资源,获取到了就执行操作,没有获取到就阻塞等待锁资源,执行完操作之后就归还锁资源。

 所谓原语的原子性操作是指一个操作中的所有动作,要么成功完成,要么全不做。也就是说,原语操作是一个不可分割的整体。为了保证原语操作的正确性,必须保证原语具有原子性。在单机环境下,操作的原子性一般是通过关闭中断来实现的。由于中断是计算机与外设通信的重要手段,关闭中断会对系统产生很大的影响,所以在实现时一定要避免原语操作花费时间过长,绝对不允许原语中出现死循环。

可见性:一个资源被修改后,是否对其他线程是立即可见的(一个变量的修改存在一个过程,将数据从内存加载的cpu寄存器,进行运算,完毕后交还内存,但是这个过程在代码优化中可能会被编译器优化,将数据放入寄存器,则后续运算只从寄存器取数据,就节省了从内存获取数据的时间)

有序性:简单理解,程序按照写代码的先后顺序执行,就是有序的。(编译器有时候会为了提高程序效率进行代码优化,进行指令重排,来提高效率,而有序性就是禁止指令重排)

而volatile关键字的作用是,防止编译器过度优化,因此具备 可见性与有序性 功能

猜你喜欢

转载自blog.csdn.net/weixin_66151870/article/details/129087539