漫谈并发

关于并发,百科中给出的精准的定义:“ 在计算机科学中,并行性(英语:Concurrency)是指在一个系统中,拥有多个计算,这些计算有同时执行的特性,而且他们之间有着潜在的互动。因此系统可进行的执行路径会有相当多个,而且结果可能具有不确定性。并发计算可能会在具备多核心的同一个晶片中复合运行,以优先分时线程在同一个处理器中执行,或在不同的处理器执行”。这里强调一下,“并发”不是“并行”,或者说“并发”仅仅是“并行”的一个子集,具有并行的“表面特性”,然而概念上是不同的,可以用下图简单说明一下:

并发的有点就不赘述了,主要想介绍一下并发编程相关的知识点。并发常规做法主要有:多进程、单进程多线程、多路复用等,无论哪种方案都存在资源竞争问题,以多线程为例,介绍一下如何保证并发安全性问题,传统的手段:锁、原子操作等,当然传统的手段很难保证开发效率,于是有涌现了很多更高级的并发方案,如Actor、CSP并发模型等,下面简单介绍一下。

一.传统的“锁”机制

前辈们为了做高性能并发也是费尽苦心了,提出了各种锁来保证并发的效率和安全性,常见的锁:互斥锁(Mutex)、信号量(Seamphore)、读写锁(RWLock)、条件变量(Cond)、临界区(Critical Section)

时间: 2025-01-17 09:08:53

漫谈并发的相关文章

漫谈并发编程(一) - 并发简介

并发编程是每个程序员进阶的必修之课,想写一个安全稳定,性能强劲的并发程序可没那么容易.我将在未来的日子里,与大家分享一个并发小白成长路上的所思所想.并发编程的思想是通的,但是例子得要是具现的,在该系列中将使用java语言用以演示. 此文作为为漫谈并发编程系列的第一篇,由于本人喜欢先论理再论事,而非先论事再论理,所以就以一篇对并发的文字描述开头了. 并发编程由来 早年的计算机中没有操作系统,在某个时间段内只支持运行一个程序,并且这个程序能访问计算机的所有资源.在这个程序完全执行完后,再执行下一个程

漫谈并发编程(一) - 并发简单介绍

并发编程是每一个程序猿进阶的必修之课,想写一个安全稳定,性能强劲的并发程序可没那么easy.我将在未来的日子里,与大家分享一个并发小白成长路上的所思所想.并发编程的思想是通的,可是样例得要是具现的,在该系列中将使用java语言用以演示. 此文作为为漫谈并发编程系列的第一篇,探本溯源,以一篇对并发的文字描写叙述开头. 并发编程由来 早年的计算机中没有操作系统,在某个时间段内仅仅支持运行一个程序,而且这个程序能訪问计算机的全部资源.在这个程序全然运行完后,再运行下一个程序. 在此时,引入并发编程的优

漫谈并发编程(五):线程之间的协作

编写多线程程序需要进行线程协作,前面介绍的利用互斥来防止线程竞速是来解决线程协作的衍生危害的.编写线程协作程序的关键是解决线程之间的协调问题,在这些任务中,某些可以并行执行,但是某些步骤需要所有的任务都结束之后才能开动. wait()与notifyAll() wait()使你可以等待某个条件发生变化,wait()会在等待外部世界产生变化的时候将任务挂起,并且只有在notify()或notifyAll()发生时,即表示发生了某些感兴趣的事物,这个任务才会被唤醒并去检查所产生的变化. 调用sleep

漫谈并发编程(三):共享受限资源

解决共享资源竞争 一个不正确的访问资源示例 考虑下面的例子,其中一个任务产生偶数,而其他任务消费这些数字.这里,消费者任务的唯一工作就是检查偶数的有效性. 我们先定义一个偶数生成器的抽象父类. public abstract class IntGenerator { private volatile boolean canceled = false; public abstract int next( ); public void cancle( ) { canceled = true; } p

漫谈并发编程(二):java线程的创建与基本控制

java线程的创建 定义任务 在java中使用任务这个名词来表示一个线程控制流的代码段,用Runnable接口来标记一个任务,该接口的run方法为线程执行的代码段. public class LiftOff implements Runnable { protected int countDown = 10; private static int taskCount = 0; private final int id = taskCount++; public void run() { whil

漫谈并发编程(四):终结任务

使用状态变量来终结任务 有时我们可以使用一个状态变量(如布尔值)来终结任务的执行,这种方式非常平和,且提供给你机会在任务终止前做一些操作.如: public class StateStopTask implements Runnable{ private static volatile boolean isCancled = false; public void run() { while(true) { if(isCancled == true) { System.out.println("S

漫谈并发编程(六):java中一些常用的并发构件的介绍

CountDownLatch 它被用来同步一个或多个任务,强制它们等待其它任务执行的一组操作完成. 你可以向CountDownLatch对象设置一个初始计数值,任何在这个对象上调用await()的方法都将阻塞,直至这个计数值到达0.其它任务在结束其工作时,可以在该对象上调用countDown()来减小这个计数值.CountDownLatch被设计为只触发一次,计数值不能被重置.如果你需要能够重置值的版本,则可以使用CylicBarrier. 调用countDown()的任务在产生这个调用时并没有

融云开发漫谈:你是否了解Go语言并发编程的第一要义?

2007年诞生的Go语言,凭借其近C的执行性能和近解析型语言的开发效率,以及近乎完美的编译速度,席卷全球.Go语言相关书籍也如雨后春笋般涌现,前不久,一本名为<Go语言并发之道>的书籍被翻译引进国内,并迅速引起广泛关注,本书由融云的一位研发工程师赵晨光联合翻译,旨在帮助Go语言学习者了解并发设计的模式和应用场景,更加深入理解Go语言特性,从而提升自身技术研发水平. “Go语言并发编程快速入门的第一要义” <Go语言并发之道>主要讲解了Golang语言的最佳实践和模式,引导读者如何选

分布式系统漫谈一 —— Google三驾马车: GFS,mapreduce,Bigtable

分布式系统学习必读文章!!!! 原文:http://blog.sina.com.cn/s/blog_4ed630e801000bi3.html 分布式系统漫谈一 —— Google三驾马车: GFS,mapreduce,Bigtable 谈到分布式系统,就不得不提Google的三驾马车:Google fs[1],Mapreduce[2],Bigtable[3]. 虽然Google没有公布这三个产品的源码,但是他发布了这三个产品的详细设计论文.而且,Yahoo资助的Hadoop也有按照这三篇论文的