多线程什么时候该加锁?

1 .加锁、解锁(同步/互斥)是多线程中非常基本的操作,但我却看到不少的代码对它们处理的很不好。简单说来有三类问题,一是加锁范围太大,虽然避免了逻辑错误,但锁了不该锁的东西,难免降低程序的效率;二是该锁的不锁,导致各种莫名其妙的错误;三是加锁方式不合适,该用临界区的用内核对象等,也会降低程序的效率。

要正确的运用锁操作,首先要弄清楚什么时候需要加锁。一般可能“同时发生多个写操作”或“同时发生读写操作”时,必需要加Lock.

 

2,NET警惕匿名方法造成变量共享 http://www.csharpwin.com/csharpspace/8200r3812.shtml

 

此类问题也不光会出现在匿名方法中。如果您使用Lambda表达式创建了一个表达式树,其中也用到了一个“局部变量”,那么表达式树在解析或执行时同样也会获取“当前”的值,而不是创建表达式树时的值。

 

即:Linq中使用List.AsParallel()

 

 //账单所包含的订单总重。此时会导致未知的错误!!

可能同一时间有线程A在返回Weigh(读),另一线程B进行Sum计算;产生多线程同时读写操作。 

decimal orderTotalWeight = order7.AsParallel().Sum(m => bllOrderInfo.GetProductCodeWeight(m.Code) * m.Quantity).ToDecimal();

 

 

       /// <summary>
        /// 根据产品编号获取重量。
        /// </summary>
        /// <param name="productCode"></param>
        /// <returns></returns>
        public decimal GetProductCodeWeight(string productCode)
        {

                . .. . .

               ...........

               return result;
        }

 

共享数据个人理解的是全局变量,多个线程同时访问全局变量会导致不可预知的错误!

例如:

private int m_Count;

public void  Calc()

{

    int count;

    count++;

    lock()

    {

       m_Count++;

    }

}
 

时间: 2024-09-22 09:04:54

多线程什么时候该加锁?的相关文章

C++开发:为什么多线程读写shared_ptr要加锁的详细介绍_C 语言

我在<Linux 多线程服务端编程:使用 muduo C++ 网络库>第 1.9 节"再论 shared_ptr 的线程安全"中写道: (shared_ptr)的引用计数本身是安全且无锁的,但对象的读写则不是,因为 shared_ptr 有两个数据成员,读写操作不能原子化.根据文档(http://www.boost.org/doc/libs/release/libs/smart_ptr/shared_ptr.htm#ThreadSafety), shared_ptr 的线程

多线程读写 shared_ptr需要加锁的原因

我在<Linux 多线程服务端编程:使用 muduo C++ 网络库>第 1.9 节"再论 shared_ptr 的线程 安全"中写道: (shared_ptr)的引用计数本身是安全且无锁的,但对象的读写则不是,因为 shared_ptr 有两个数据成员,读写操作不能原子化.根据文档 (http://www.boost.org/doc/libs/release/libs/smart_ptr/shared_ptr.htm#ThreadSafety), shared_ptr 的

多线程专题之线程死锁原因之谜

引子:线程死锁曾是多少程序员的噩梦,每每为此食不甘味,夜不成寐,一句话:苦不堪言.本文从几个场景入手,试图解开产生死锁的原因之谜. 教科书:说的很具体,理解很抽象 关于死锁产生的原因<操作系统>中有比较好的说明: (1)因为系统资源不足. (2)进程运行推进的顺序不合适. (3)资源分配不当等. 关于死锁出现的必要条件也有比较具体的说明: (1)互斥条件:一个资源每次只能被一个进程使用. (2)请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放. (3)不剥夺条件:进程已获得的

40个Java多线程问题总结

前言 Java多线程分类中写了21篇多线程的文章,21篇文章的内容很多,个人认为,学习,内容越多.越杂的知识,越需要进行深刻的总结,这样才能记忆深刻,将知识变成自己的.这篇文章主要是对多线程的问题进行总结的,因此罗列了40个多线程的问题. 这些多线程的问题,有些来源于各大网站.有些来源于自己的思考.可能有些问题网上有.可能有些问题对应的答案也有.也可能有些各位网友也都看过,但是本文写作的重心就是所有的问题都会按照自己的理解回答一遍,不会去看网上的答案,因此可能有些问题讲的不对,能指正的希望大家不

分享40个Java多线程问题小结_java

Java多线程是什么 Java提供的并发(同时.独立)处理多个任务的机制.多个线程共存于同一JVM进程里面,所以共用相同的内存空间,较之多进程,多线程之间的通信更轻量级.依我的理解,Java多线程完全就是为了提高CPU的利用率.Java的线程有4种状态,新建(New).运行(Runnable).阻塞(Blocked).结束(Dead),关键就在于阻塞(Blocked),阻塞意味着等待,阻塞的的线程不参与线程分派器(Thread Scheduler)的时间片分配,自然也就不会使用到CPU.多线程环

task中能否嵌套Parallel.foreach语句?

问题描述 业务场景是这样的:一个采集程序需要采集歌手数据,包含6个字段(代表作.专辑.性别.出道日期.国籍.爱好).这6个待采集的数据字段分布在6批不同的网址,每批网址有10w个(就是说一共需要采集60w网址).问题1:为了提高采集速度,我是否应该在程序中开启6个task去执行采集任务,然后在每个task中再使用Parallel.foreach去采集对应的10w个网址?问题2:为了提高采集速度,是否应该为这6个待采集字段建立6个数据表,以免多个线程同时写入一个表导致写入速度慢?谢谢. 解决方案

【秒懂设计模式】单例设计模式

 秒懂设计模式--单例设计模式 (三)单例设计模式 1.先解释一下,什么是单例模式呢? 在Java中是这样定义的:"一个类有且仅有一个实例,并且自行实例化向整个系统提供." 显然从单例模式的定义中,我们可以发现它有三个要点: ①某个类只能有一个实例: ②它必须自行创建这个实例: ③它必须自行向整个系统提供这个实例. 2.要满足这三个要点,应该如何实现呢?下面让我们来逐条分析: ①如何保证某个类只能有一个实例? 让我先来想一下,一个类的对象是如何创建的呢?答案是:一个类的对象的产生是由类

java单例问题?

问题描述 N个客户机掉一个单例会不回使系统性能下降.java单例是多线程.我还是有点不明白这个, 解决方案 有同步,就会慢下来.没有,就不会,而且有可能会被HotSpot优化后,跑的更快.解决方案二:首先N个客户机掉一个单例并不意味着他们调用的是同一个对象,而单例更多的是每个客户机进入以后先实例化一个对象,然后存在于这个客户机访问的这个生命周期.你多线程访问同一个对象很不安全,如果其中有一个释放他的内存空间,那么所有的都得重新再去获得,这在应用中显然是不可能的!这是自己的见解,希望牛人提点!解决

蛙蛙推荐:自己写个IIS玩-协议解析篇

这里不是说用System.Web.Hosting.ApplicationHost和System.Net.HttpListener做的那种web server,而是直接用socket api做一个简单的能收发HTTP包的网络服务器,当然也不会完全实现RFC 2616,主要学习探索用. 我们先来看HTTP协议解析部分,做一个HTTP协议栈-HttpStatck,大概看一下HTTP协议基础,   1.消息头和消息体中间用两个\r\n(0x0d0x0a)来分割,   2.消息头之间用\r\n分割,