Thread in depth 3:Synchronization
Synchronization means multi threads access the same resource (data, variable ,etc) should not cause a corruption to it.If all methods of a class promise threading synchronization,we call that the class is "Thread Safe".
Thread Safety
ALL static methods of the .net framework are promised thread-safe. When we are writting class and method we should pay a little bit attention on the thread safety,we can:
- Avoid to use static data.Different thread can access the same static data at the same time so may cause corruption to it.
- Avoid to use global variable,Use local variable.Different thread can access the same data referred by global variable. local variable inside the method will have a particular copy in the thread stack so corruption won't happen.
- Use lock construct. But this will cause a performance problem,because the thread will be blocked or being "spin-locked" and waste CPU and memory, so use it very carefully.
Interlocked
In most computer,read and write operation to a data is not atomically. By "atomically" it means those data will be read or written at an automical state.For example,CPU needs instructions to set a int variable from 0 to 1:
- Load a value from an instance variable into a register, by using the "MOV" instruction
- Increment or decrement the value,by using "INC" instruction
- Store the value in the instance variable,by using "MOV" instruction
When a thread is doing the second step and not yet store the value back, another thread may preempt and get the origin value,a very bad problem may happen.
We can use Interlocked class which locates in System.Threading namespace to avoid this situation. Interlocked provides atomic operations for variables that are shared by multiple threads.Think of the code snippet below.
static void Main(string[] args)
{
InterlockedExampleClass example = new InterlockedExampleClass();
Task.Run(() => example.ThreadSafeMethod());
Task.Run(() => example.ThreadSafeMethod());
Console.Read();
}
} class InterlockedExampleClass
{
int usingLock = ;//a flag indicates if a thread is using the lock public void ThreadSafeMethod()
{
if (Interlocked.Exchange(ref usingLock,1) == )//when an thread change the value of usingLock to 1, another thread will get a false because usingLock would be 1 then no opportunity to enter the code block.
{
Console.WriteLine("Thread:{0} acquired the lock", Thread.CurrentThread.ManagedThreadId);
//do some non-thread-safe work here.
Thread.Sleep();
Interlocked.Exchange(ref usingLock,0);//reset to 0 and release the lock
}
}
}
SpinLock
In the last section, we talked about the Interlocked class and show some code of how to implement a lock.But the problem is, the second thread won't wait but just skip away,but in most time we want it to wait for the first thread to be finished.We can change the code to a SpinLock.SpinLock means we keep the thread running and waitting until the first thread is finished.The change is pretty simple as you can see below:
class Program
{
static void Main(string[] args)
{
InterlocedExampleClass example = new InterlocedExampleClass();
Task.Run(() => example.ThreadSafeMethod());
Task.Run(() => example.ThreadSafeMethod());
Console.Read();
}
} class InterlocedExampleClass
{
int usingLock = ;//a flag indicates if a thread private void Enter()
{
//if usingLock is changed from 0 to 1,then return from this method can continue its job,otherwise keep spinning here.
while (true)
if(Interlocked.Exchange(ref usingLock, ) == )
return;
}
private void Leave()
{
//reset to 0 and release the lock
Interlocked.Exchange(ref usingLock,);
}
public void ThreadSafeMethod()
{
Enter();
Console.WriteLine("Thread:{0} acquired the lock", Thread.CurrentThread.ManagedThreadId);
//do some non-thread-safe work here.
Thread.Sleep();
Leave(); }
}
We created the Enter method and Leave method. The first thread arrive the Enter method and set usingLock to 1 and get the origin value 0 and return,others threads have to keep dead loop until the first thread change usingLock variable back to 0.
Spinlock is not a good thing because it causes a waste lots of CPU and memory when dead looping.
See also:
线程漫谈——.NET线程同步之Interlocked和ReadWrite锁
Thread in depth 3:Synchronization的更多相关文章
- Thread in depth 4:Synchronous primitives
There are some synchronization primitives in .NET used to achieve thread synchronization Monitor c# ...
- Thread in depth 2:Asynchronization and Task
When we want to do a work asynchronously, creating a new thread is a good way. .NET provides two oth ...
- Thread in depth 1: The basic
Every single thread has the follow elements: Execution Context:Every thread has a execution context ...
- 【转】Native Thread for Win32 B-Threads Synchronization(通俗易懂,非常好)
http://www.bogotobogo.com/cplusplus/multithreading_win32B.php Synchronization Between Threads In t ...
- Efficient ticket lock synchronization implementation using early wakeup in the presence of oversubscription
A turn-oriented thread and/or process synchronization facility obtains a ticket value from a monoton ...
- Thread Safety in Java(java中的线程安全)
Thread Safety in Java is a very important topic. Java provide multi-threaded environment support usi ...
- java命令行HPROF Profiler
The HPROF Profiler The Heap and CPU Profiling Agent (HPROF)是JAVA2 SDK自带的一个简单的profiler代理,它通过与Java Vir ...
- Java Concurrency - 浅析 CyclicBarrier 的用法
The Java concurrency API provides a synchronizing utility that allows the synchronization of two or ...
- Spring事务传播机制
Spring在TransactionDefinition接口中规定了7种类型的事务传播行为,它们规定了事务方法和事务方法发生嵌套调用时事务如何进行传播,即协调已经有事务标识的方法之间的发生调用时的事务 ...
随机推荐
- 视图的URL配置,找不到我设置的第一个Page
问题:视图的URL配置,找不到我设置的第一个Page 我的代码如下: 结果访问/test/时说找不到这个page 原因:patterns方法的参数有两个,一个是prefix,一个是参数元祖,详见下 ...
- Openvpn 日常问题解决
一.Openven的在windows系统下的使用: 1.Openven客户端2.2.0:http://pan.baidu.com/s/1sjJij4T 安装好客户端软件后,将服务器下发的证书和配置文件 ...
- 【校招面试 之 剑指offer】第18题 删除链表中的节点
题目一:在O(1)时间内删除链表节点. 给定单项链表的头指针和一个节点指针,定义一个函数在O(1)时间内删除该节点. 思路:(1)如果要删除的节点不是链表的尾节点,则将被删除节点的内容复制到该节点,然 ...
- day4:vcp考试
Q61. Which two statements are true regarding Virtual SAN Fault Domains? (Choose two.)A. They enable ...
- 5-Qt读取文件失败原因
刚开始准备读取当前目录下的txt文件: QFile file(":/xuhao.txt");或者: QFile file("./xuhao.txt"); 但是一 ...
- visio2003 数据表模型中显示字段类型和注释
1.在visio菜单上选择 数据库->选项->文档. 2.在常规中找到 [在图表中可见的名称] 选中 两者. 3.在表中找到 [数据类型] 选中 显示物理. 4.在数据表模型中创建字段,并 ...
- HHvm建站环境搭建方法:Nginx,Mariadb,hhvm及lnmp/lamp安装部署
HHVM起源于Facebook公司,是一个开源的PHP虚拟机,使用JIT的编译方式以及其他技术,让PHP代码的执行性能大幅提升.HHVM提升PHP性能的途径,采用的方式就是替代Zend引擎来生成和执行 ...
- 谈谈我对Ui设计师的一些观点
做ui设计师3年多了,对ui设计师在工作中也了解了许多. 作为UI设计师,在工作中需要清楚了解设计的目的,尤其是你做的不是大众化产品,不能以个人认知.很强的主题性来确定. 例如针对儿童人群的app时, ...
- Vue.js 登录注册实现
转载 http://www.jb51.net/article/118003.htm
- IntelliJ IDEA 2017版 spring-boot使用Spring Data JPA使用Repository<T, T>编程
1.环境搭建pom.xml搭建 <?xml version="1.0" encoding="UTF-8"?> <project xmlns=& ...