随笔分类 -  多线程和并行计算

1
摘要:和朱晔一起复习Java并发(五):并发容器和同步器 本节我们先会来复习一下java.util.concurrent下面的一些并发容器,然后再会来简单看一下各种同步器。 ConcurrentHashMap和ConcurrentSkipListMap的性能 首先,我们来测试一下ConcurrentHas 阅读全文
posted @ 2019-07-21 18:51 lovecindywang 阅读(1112) 评论(1) 推荐(1) 编辑
摘要:本节我们来研究下并发包中的Atomic类型。 AtomicXXX和XXXAdder以及XXXAccumulator性能测试 先来一把性能测试,对比一下AtomicLong(1.5出来的)、LongAdder(1.8出来的)和LongAccumulator(1.8出来的)用于简单累加的性能。 程序逻辑 阅读全文
posted @ 2019-07-21 09:24 lovecindywang 阅读(821) 评论(0) 推荐(1) 编辑
摘要:这个专题我发现怎么慢慢演化为性能测试了,遇到任何东西我就忍不住去测一把。本文我们会大概看一下各种锁数据结构的简单用法,顺便也会来比拼一下性能。 各种并发锁 首先,我们定一个抽象基类,用于各种锁测试的一些公共代码: 我们需要使用锁来保护counter和hashMap这2个资源 write字段表示这个线 阅读全文
posted @ 2019-07-20 08:55 lovecindywang 阅读(964) 评论(1) 推荐(1) 编辑
摘要:和朱晔一起复习Java并发(二):队列 老样子,我们还是从一些例子开始慢慢熟悉各种并发队列。以看小说看故事的心态来学习不会显得那么枯燥而且更容易记忆深刻。 阻塞队列的等待? 阻塞队列最适合做的事情就是做为生产消费者的中间存储,以抵抗生产者消费者速率不匹配的问题,不但是在速率不匹配的时候能够有地方暂存 阅读全文
posted @ 2019-07-17 20:48 lovecindywang 阅读(740) 评论(0) 推荐(1) 编辑
摘要:和我之前的Spring系列文章一样,我们会以做一些Demo做实验的方式来复习一些知识点。 本文我们先从Java并发中最最常用的线程池开始。 从一个线程池实验开始 首先我们写一个方法来每秒一次定时输出线程池的基本信息: 然后,我们写一个方法来定时提交任务到线程池: 可以看到: 一共提交20个任务 每秒 阅读全文
posted @ 2019-07-13 21:10 lovecindywang 阅读(1176) 评论(0) 推荐(1) 编辑
摘要:之前的文章中我们介绍了如何在.NET下运用相关类库进行多线程编程的基础,我们知道.NET 4.0已经正式推出了,带来的重要特性是并行库。本文就谈谈对并行计算的一些理解和看法。并行计算不是一个很新的概念... 阅读全文
posted @ 2010-05-19 14:22 lovecindywang 阅读(4371) 评论(1) 推荐(3) 编辑
摘要:线程同步的问题 1) 我们必须找到代码中所有可能被多个线程同时访问的资源,然后使用线程同步来保护资源,并且我们没有办法来验证是不是正确进行了线程同步,包括是否有遗漏和是否对不需要同步的资源进行同步。... 阅读全文
posted @ 2010-03-08 17:30 lovecindywang 阅读(1820) 评论(2) 推荐(0) 编辑
摘要:最近此书出了第三版,在阅读此书线程部分的过程中有很多心得,补充了此前知识盲点,因此把这些关键和重要的知识点汇集成日志文章并且纳入到这个系列中。顺便说一下,笔者喜欢这本书的原因是作者作为微软顾问并没有按照MSDN的教条教大家怎么去用而是能说出很多自己的观点甚至很多是微软.NET框架不够的地方,并给出自己的实现。为什么说线程是比较昂贵的?1) 从内存上来说,(对于32位架构)每一个线程包含线程内核对象... 阅读全文
posted @ 2010-02-24 17:21 lovecindywang 阅读(4398) 评论(4) 推荐(0) 编辑
摘要:上次我们说了,要进行多线程编程,我们可以使用最原始的方式也是最灵活的方式进行,那就是Thread(ThreadPool)+信号量+锁+Control.Invoke。.NET的异步编程模型给我们提供了一... 阅读全文
posted @ 2010-01-09 14:18 lovecindywang 阅读(3591) 评论(5) 推荐(4) 编辑
摘要:谈多线程谈到现在,我们要明确多线程的一个好处是可以进行并行的运算(充分利用多核处理器,对于桌面应用程序来说就更重要一点了,没有WEB服务器,利用多核只能靠自己),还有一个好处就是异步操作,就是我们可以... 阅读全文
posted @ 2010-01-08 22:04 lovecindywang 阅读(4165) 评论(4) 推荐(4) 编辑
摘要:在之前的文章中我们介绍过两种Timer和BackgroundWorker组件,在上文中我们提到过,强烈建议在UI线程上操作控件,否则很容易产生人品问题。可以想到,上次介绍的两个Timer基于Threa... 阅读全文
posted @ 2010-01-07 14:58 lovecindywang 阅读(3862) 评论(2) 推荐(2) 编辑
摘要:首先我们创建一个Winform的应用程序,在上面添加一个多行文本框和一个按钮控件,按钮的事件如下: Thread.Sleep(1000);StringBuilder sb = new StringB... 阅读全文
posted @ 2010-01-06 12:04 lovecindywang 阅读(7256) 评论(9) 推荐(6) 编辑
摘要:浅谈.NET下的多线程和并行计算(一)前言浅谈.NET下的多线程和并行计算(二)线程基本知识浅谈.NET下的多线程和并行计算(三)线程同步基础上浅谈.NET下的多线程和并行计算(四)线程同步基础下浅谈.NET下的多线程和并行计算(五)线程池基础上浅谈.NET下的多线程和并行计算(六)线程池基础下浅谈.NET下的多线程和并行计算(七)基于多线程的基本组件浅谈.NET下的多线程和并行计算(八)Winform中多线程编程基础上浅谈.NET下的多线程和并行计算(九)Winform中多线程编程基础下浅谈.NET下的多线程和并行计算(十).NET异步编程模型基础上浅谈.NET下的多线程和并行计算(十一). 阅读全文
posted @ 2010-01-05 19:29 lovecindywang 阅读(3977) 评论(8) 推荐(6) 编辑
摘要:在多线程应用中我们有一些很常见的需求,比如定时去做计划任务,或者是在执行一个长时间的任务,在执行这个任务的过程中能有进度显示(能想到要实现这个需求需要新开一个线程,避免阻塞UI的更新)。对于这些应用.NET提供了现成的组件。 首先来看一下System.Threading的Timer组件,它提供了定时执行某个任务的方法: ThreadPool.SetMinThreads(2, 2);Thread... 阅读全文
posted @ 2010-01-05 11:03 lovecindywang 阅读(4116) 评论(3) 推荐(5) 编辑
摘要:这节我们按照线程池的核心思想来自定义一个简单的线程池: 1) 池中使用的线程不少于一定数量,不多于一定数量 2) 池中线程不够的时候创建,富裕的时候收回 3) 任务排队,没有可用线程时,任务等待... 阅读全文
posted @ 2010-01-04 14:44 lovecindywang 阅读(3656) 评论(1) 推荐(2) 编辑
摘要:池(Pool)是一个很常见的提高性能的方式。比如线程池连接池等,之所以有这些池是因为线程和数据库连接的创建和关闭是一种比较昂贵的行为。对于这种昂贵的资源我们往往会考虑在一个池容器中放置一些资源,在用的时候去拿,在不够的时候添点,在用完就归还,这样就可以避免不断的创建资源和销毁资源。 如果您做过相关实验的话可能会觉得不以为然,似乎开1000个线程也用不了几百毫秒。我们要这么想,对于一个高并发的环境... 阅读全文
posted @ 2009-12-31 13:20 lovecindywang 阅读(5636) 评论(5) 推荐(2) 编辑
摘要:回顾一下上次,我们讨论了lock/AutoResetEvent/ManualResetEvent以及Semaphore。这些用于线程同步的结构叫做同步基元。同步基元从类型上可以分为锁定/通知/联锁三种。lock显然锁定方式,而且是独占锁定,也就是在锁释放之前不能由其它线程获得。Semaphore也是一种锁定,只不过不是独占锁,可以指定多少个线程访问代码块。AutoResetEvent和Manual... 阅读全文
posted @ 2009-12-30 17:16 lovecindywang 阅读(4349) 评论(9) 推荐(6) 编辑
摘要:其实,如果线程都是很独立的,不涉及到任何资源访问的,那么这些毫无干扰的线程不会产生什么问题。但是在实际应用中我们的线程总是涉及到资源访问的,而且往往涉及到共享资源的访问,那么就产生了线程同步的问题。一直觉得线程同步这个名词很奇怪,字面上看同步就是使得步调一致,线程同步是不是就是让线程步调一致的访问资源呢?事实上反了,线程同步恰巧是让线程不同时去访问资源而是去按照我们期望的顺序依次访问资源(是同步资... 阅读全文
posted @ 2009-12-28 15:44 lovecindywang 阅读(4915) 评论(14) 推荐(11) 编辑
摘要:首先来看看如何创建线程:Console.WriteLine(Process.GetCurrentProcess().Threads.Count);Thread t1 = new Thread(() => { Thread.Sleep(1000); Thread t = Thread.CurrentThread; Console.WriteLine("Name: " + t.Name); Co... 阅读全文
posted @ 2009-12-25 16:15 lovecindywang 阅读(5398) 评论(11) 推荐(8) 编辑
摘要:作为一个ASP.NET开发人员,在之前的开发经历中接触多线程编程的机会并不是很多,但是随着.NET 4.0的发布临近,我越来越感受到未来的1-2年中并行计算将会有很大的应用。于是决定通过写日志的方式来总结一下.NET 3.5下的多线程编程进而引入.NET 4.0提供的新的并行库以及新的并行编程模式和编程的思维方式。个人觉得在日常的编程中对于ASP.NET程序员来说使用多线程编程不是很多,其实我们无... 阅读全文
posted @ 2009-12-25 12:47 lovecindywang 阅读(6300) 评论(24) 推荐(15) 编辑

1