《C#多线程编程实战(原书第2版)》——2.2 执行基本的原子操作

简介:

本节书摘来自华章出版社《C#多线程编程实战(原书第2版)》一书中的第2章,第2.2节,作者(美)易格恩·阿格佛温(Eugene Agafonov),黄博文 黄辉兰 译,更多章节内容可以访问云栖社区“华章计算机”公众号查看。

2.2 执行基本的原子操作

本节将展示如何对对象执行基本的原子操作,从而不用阻塞线程就可避免竞争条件。

2.2.1 准备工作

为了学习本节,你需要安装Visual Studio 2015。除此之外无需其他准备。本节的源代码放置在Book SamplesChapter2Recipe1目录中。

2.2.2 实现方式

请执行以下的步骤来了解基本的原子操作:

1.启动Visual Studio 2015。新建一个C#控制台应用程序项目。

2.在Program.cs文件中加入以下using指令:


03e5c774185bea42a89c5cc24628e523465af816

3.在Main方法下面加入以下代码片段:


393924a75c7d69b690979ac902f79c15fab6ae8f


f99a3f2530b11c61105f585eb0f46e72095ce6ef

4.在Main方法中加入以下代码片段:


f28227d96581746eaff9fc17407354a653a09706

5.运行程序。

2.2.3 工作原理

当程序运行时,会创建三个线程来运行TestCounter方法中的代码。该方法对一个对象按序执行了递增或递减操作。起初的Counter对象不是线程安全的,我们会遇到竞争条件。所以第一个例子中计数器的结果值是不确定的。我们可能会得到数字0。然而如果运行程序多次,你将最终得到一些不正确的非零结果。

在第1章中,我们通过锁定对象解决了这个问题。在一个线程获取旧的计数器值并计算后赋予新的值之前,其他线程都被阻塞了。然而,如果我们采用上述方式执行该操作,中途不能停止。而借助于Interlocked类,我们无需锁定任何对象即可获取到正确的结果。Interlocked提供了Increment、Decrement和Add等基本数学操作的原子方法,从而帮助我们在编写Counter类时无需使用锁。

相关文章
|
3月前
多线程并发锁的方案—原子操作
多线程并发锁的方案—原子操作
|
14天前
|
存储 安全 Java
java多线程之原子操作类
java多线程之原子操作类
|
存储 API C#
C#多线程系列(3):原子操作
C#多线程系列(3):原子操作
310 0
C#多线程系列(3):原子操作
|
缓存 Java
【Java 并发编程】线程简介 ( 原子操作 | volatile 关键字使用场景 )
【Java 并发编程】线程简介 ( 原子操作 | volatile 关键字使用场景 )
122 0
【Java 并发编程】线程简介 ( 原子操作 | volatile 关键字使用场景 )
|
1月前
|
C#
24. C# 编程:用户设定敌人初始血值的实现
24. C# 编程:用户设定敌人初始血值的实现
19 0
|
2月前
|
SQL 数据库连接 应用服务中间件
C#WinForm基础编程(三)
C#WinForm基础编程
73 0
|
2月前
C#WinForm基础编程(二)
C#WinForm基础编程
55 0
|
2月前
|
C# 数据安全/隐私保护
C#WinForm基础编程(一)
C#WinForm基础编程
60 0
|
4月前
|
数据采集 前端开发 C#
C#编程艺术:Fizzler库助您高效爬取www.twitter.com音频
Twitter是全球最大的社交媒体平台之一,包含丰富的音频资源。用户可以在Twitter上发布、转发、评论和收听各种音频内容,如音乐、播客、新闻、故事等,直接从Twitter抓取音频数据并非易事,尤其是在考虑到可能的封锁和反爬虫机制。Twitter会对频繁访问的IP地址进行限制或封禁,以防止恶意爬虫的行为。因此,我们需要使用一些技术手段来规避这些障碍,确保稳定而高效的数据访问。
C#编程艺术:Fizzler库助您高效爬取www.twitter.com音频

热门文章

最新文章