【多线程】操作多线程程序中的原子性有多重要!

本文探讨了多线程环境中变量读写、位域操作的线程安全性和如何使用原子操作。指出X86 CPU通过三种机制保证某些原子操作,但非对齐或跨越边界的操作可能需要同步。对Bit field的读写通常不是线程安全的,建议使用锁或原子API确保安全。最后,提到了不同编程语言中常见的原子操作API。
摘要由CSDN通过智能技术生成

目录

前言

本文主要讨论了三个问题:

1. 多线程环境下对变量的读写操作是否是原子的?

它基于以下三种机制保证了多核中加锁的原子操作(8.1节):

这三个机制相互独立,相辅相承。简单的理解起来就是

(1)中的基本的操作提供了原子性支持呢?

那么哪些操作是非原子的呢?

2. 对Bit field(位域)的读写操作是否是线程安全的?

3. 程序员该怎么用Atomic操作?

常见的API如下:


前言

原子操作 就是不可再分的操作。在多线程程序中原子操作是一个非常重要的概念,它常常用来实现一些同步机制,同时也是一些常见的多线程Bug的源头。以下是小编整理的一份Java多线程的思维导图,包含了许多核心的知识点,有兴趣的小伙伴可以点击看看!

本文主要讨论了三个问题:

1. 多线程程序中对变量的读写操作是否是原子的?

2. 多线程程序中对Bit field(位域)的读写操作是否是线程安全的?

3. 程序员该如何使用原子操作?

1. 多线程环境下对变量的读写操作是否是原子的?

我们先从一道很热门的百度笔试题讲起。

很多人讲不清楚其背后的原理,下面我们就来对它进行一下剖析(其实这个题目有点歧义,后面我们会讲到):

以下多线程对int型变量x的操作,哪几个需要进行同步:( )A. x=y; B. x++; C. ++x; D. x=1;

要彻底理解这个问题,我们首先需要从硬件讲起。

以常见的X86 CPU来说,根据Intel的 参考手册 ,

它基于以下三种机制保证了多核中加锁的原子操作(8.1节):

(1)Guaranteed atomic operations (注:8.1.1节有详细介绍)

(2)Bus locking, using the LOCK# signal and the LOCK instruction prefix

(3)Cache coherency protocols that ensure that atomic operations can be carried out on cached data structures (cache lock); this mechanism is present in the Pentium 4, Intel Xeon, and P6 family processors

这三个机制相互独立,相辅相承。简单的理解起来就是

(1)一些基本的内存读写操作是本身已经被硬件提供了原子性保证(例如读写单个字节的操作);

(2)一些需要保证原子性但是没有被第(1)条机制提供支持的操作(例如read-modify-write)可以通过使用”LOCK#”来锁定总线,从而保证操作的原子性

(3)因为很多内存数据是已经存放在L1/L2 cache中了,对这些数据的原子操作只需要与本地的cache打交道,而不需要与总线打交道,所以CPU就提供了cache coherency机制来保证其它的那些也cache了这些数据的processor能读到最新的值。

那么CPU对哪些

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值