摘要:
Actors模型(Actor model)首先是由Carl Hewitt在1973定义, 由Erlang OTP (Open Telecom Platform) 推广,其 消息传递更加符合面向对象的原始意图。 Actors属于并发组件模型 ,通过组件方式定义并发编程范式的高级阶段,避免使用者直接接触多线程并发或线程池等基础概念。 传统多数流行的语言并发是基于多线程之间的共享内存,使用同步方法防止写争夺,Actors使用消息模型,每个Actors在同一时间处理最多一个消息,可以发送消息给其他Actors,保证了单独写原则。从而巧妙避免了多线程写争夺。 Actors模型的特点是:隔离计算实... 阅读全文
随笔分类 - 并发(并行,多线程)
线程通信机制:共享内存 VS 消息传递
2014-03-09 13:35 by youxin, 4441 阅读, 收藏, 编辑
摘要:
在并发编程中,我们必须考虑的问题时如何在两个线程间进行通讯。这里的通讯指的是不同的线程之间如何交换信息。目前有两种方式:1、共享内存2、消息传递(actor 模型)共享内存:共享内存这种方式比较常见,我们经常会设置一个共享变量。然后多个线程去操作同一个共享变量。从而达到线程通讯的目的。例如,我们使用多个线程去执行页面抓取任务,我们可以使用一个共享变量count来记录任务完成的数量。每当一个线程完成抓取任务,会在原来的count上执行加1操作。这样每个线程都可以通过获取这个count变量来获得当前任务的完成情况。当然必须要考虑的是共享变量的同步问题,这也共享内存容易出错的原因所在。这种通讯模型中 阅读全文
java 内存模型
2014-03-08 20:35 by youxin, 304 阅读, 收藏, 编辑
摘要:
系列文章:http://ifeve.com/java-memory-model-0/本文属于作者原创,原文发表于InfoQ:http://www.infoq.com/cn/articles/java-memory-model-1并发编程模型的分类在并发编程中,我们需要处理两个关键问题:线程之间如何通信及线程之间如何同步(这里的线程是指并发执行的活动实体)。通信是指线程之间以何种机制来交换信息。在命令式编程中,线程之间的通信机制有两种:共享内存和消息传递。在共享内存的并发模型里,线程之间共享程序的公共状态,线程之间通过写-读内存中的公共状态来隐式进行通信。在消息传递的并发模型里,线程之间没有公共 阅读全文
多线程Thread-Specific Storage 模式
2014-03-07 22:46 by youxin, 374 阅读, 收藏, 编辑
摘要:
http://www.riabook.cn/doc/designpattern/ThreadSpecificStorage.htmhttp://computerdragon.blog.51cto.com/6235984/1206623 阅读全文
多线程Two-Phase Termination Pattern两阶段终止模式
2014-03-07 22:26 by youxin, 1196 阅读, 收藏, 编辑
摘要:
一 Two-Phase Termination Pattern Two-Phase Termination Pattern,指的就是当希望结束一个线程的时候,送出一个终止请求,但是不会马上停止,做一些刷新工作。进入“终止处理中”,在该状态下,不会进行该线程日常工作任务的操作,而是进行一些终止操作。 这个方式所考虑的因素如下:1,必须要考虑到使得该线程能够安全的结束,Thread中的stop会有问题的,因为它会不管线程执行到哪里,都会马上停止,不能保证安全的结束。2,一定能够进行正常的终止处理,在java中,这点可以使用finally来实现3,能够高响应的终止,收到终止后,当线程在wait或者s 阅读全文
多线程 Worker Thread 模式
2014-03-07 22:13 by youxin, 3422 阅读, 收藏, 编辑
摘要:
Worker是“工人”的意思,worker thread pattern中,工人线程(worker thread)会一次抓一件工作来处理,当没有工作可做时,工人线程会停下来等待心得工作过来。Worker Thread也叫做background thread,另外,也有人把视点放在管理工人线程的地方,称之为Thread Pool。最近闲时在看《Java多线程设计模式》,很不错,语言浅显易懂,而且编排也好,很有启发性,现在挑其中一章来写写心得worker thread是我们平时用的很多的一种多线程模式,只不过我们常常不把它当模式罢了。基本内容是:有一个流水线(channel),流水线一端有客户线程 阅读全文
java Future 模式
2014-03-07 19:53 by youxin, 1597 阅读, 收藏, 编辑
摘要:
考慮這樣一個情況,使用者可能快速翻頁瀏覽文件中,而圖片檔案很大,如此在瀏覽到有圖片的頁數時,就會導致圖片的載入,因而造成使用者瀏覽文件時會有停頓 的現象,所以我們希望在文件開啟之後,仍有一個背景作業持續載入圖片,如此使用者在快速瀏覽頁面時,所造成的停頓可以獲得改善。Future模式在請求發生時,會先產生一個Future物件給發出請求的客戶,而同時間,真正的目標物件之生成,由一個 新的執行緒持續進行(即 Worker Thread),真正的目標物件生成之後,將之設定至Future之中,而當客戶端真正需要目標物件時, 目標物件也已經準備好,可以讓客戶提取使用。一個簡單的Java程式片段示範可能像是 阅读全文
多线程的优点和代价
2014-03-07 19:34 by youxin, 567 阅读, 收藏, 编辑
摘要:
尽管面临很多挑战,多线程有一些优点使得它一直被使用。这些优点是:资源利用率更好程序设计在某些情况下更简单程序响应更快资源利用率更好想象一下,一个应用程序需要从本地文件系统中读取和处理文件的情景。比方说,从磁盘读取一个文件需要5秒,处理一个文件需要2秒。处理两个文件则需要:5秒读取文件A2秒处理文件A5秒读取文件B2秒处理文件B---------------------总共需要14秒从磁盘中读取文件的时候,大部分的CPU时间用于等待磁盘去读取数据。在这段时间里,CPU非常的空闲。它可以做一些别的事情。通过改变操作的顺序,就能够更好的使用CPU资源。看下面的顺序:5秒读取文件A5秒读取文件B + 阅读全文
转:Java同步synchronized使用
2014-03-07 19:15 by youxin, 259 阅读, 收藏, 编辑
摘要:
原文链接作者:Jakob JenkovJava 同步块(synchronized block)用来标记方法或者代码块是同步的。Java同步块用来避免竞争。本文介绍以下内容:Java同步关键字(synchronzied)实例方法同步静态方法同步实例方法中同步块静态方法中同步块Java同步示例Java同步关键字(synchronized)Java中的同步块用synchronized标记。同步块在Java中是同步在某个对象上。所有同步在一个对象上的同步块在同时只能被一个线程进入并执行操作。所有其他等待进入该同步块的线程将被阻塞,直到执行该同步块中的线程退出。有四种不同的同步块:实例方法静态方法实例方 阅读全文
管程
2014-03-07 18:49 by youxin, 2252 阅读, 收藏, 编辑
摘要:
管程是一种高级的同步原语。重要特性:任意时刻管程中只能有一个活跃进程。它是一种编程语言的组件,所以编译器知道它们很特殊,并可以采用与其他过程调用不同的方法来处理它们。典型地,当一个进程调用管程中的过程,前几条指令将检查在管程中是否有其他的活跃进程。如果有,调用进程将挂起,直到另一个进程离开管程。如果没有,则调用进程便进入管程。对管程的实现互斥由编译器负责!在Java中,只要将关键字synchronized加入到方法声明中,Java保证一旦某个线程执行该方法,就不允许其他线程执行该方法,就不允许其他线程执行该类中的任何其他方法。注意:管程是一个编程语言概念。编译器必须要识别出管程并用某种方式对互 阅读全文
【编程之美】双线程高效下载
2014-03-07 18:09 by youxin, 785 阅读, 收藏, 编辑
摘要:
假设提供了以下方法:bool GetBlockFromNet(Block *out_block);bool WriteBlockToDisk(Block *in_block);想实现高效当然是创建两个线程,A负责获取网络数据,B负责写入数据到硬盘,难点在于如何合理分配两个线程之间的工作!分析与解法:1.什么时候才算完成任务?下载完毕并且完全存储到硬盘上,两个线程才能正常终止。2.希望两个线程能同时工作,又不发生冲突,用什么方法?使用Mutex(互斥量),下载时不能存储所以弃用。使用Semaphore(信号量)是更好的选择。3.下载与存储的必要条件buffer满的时候和所有内容下载完毕,应该停止 阅读全文
多线程同步循环打印和Guarded suspension 模式
2014-03-07 16:53 by youxin, 631 阅读, 收藏, 编辑
摘要:
* 迅雷笔试题:* 有三个线程ID分别是A、B、C,请有多线编程实现,在屏幕上循环打印10次ABCABC…由于线程执行的不确定性,要保证这样有序的输出,必须控制好多线程的同步。线程同步有两种基本方法:synchronized(2)wait,notify,notifyAll/** * 锁码:公共数据区... 阅读全文
多线程信号量 Semaphore使用
2014-03-07 15:53 by youxin, 1518 阅读, 收藏, 编辑
摘要:
对信号量只能实施三种操作: 1. 初始化(initialize),也叫做建立(create) 2. 等信号(wait),也可叫做挂起(pend) 3. 给信号(signal)或发信号(post)分类: 整型信号量(integer semaphore):信号量是整数 记录型信号量(record semaphore):每个信号量s除一个整数值s.value(计数)外,还有一个进程等待队列s.L,其中是阻塞在该信号量的各个进程的标识 二进制信号量(binary semaphore):只允许信号量取0或1值 每个信号量至少须记录两个信息:信号量的值和等待该信号量的进程队列。它的类型定... 阅读全文
并发(Concurrency)和并行(Parallelism)的区别
2013-11-11 18:09 by youxin, 820 阅读, 收藏, 编辑
摘要:
最近在读《real world haskell》里关于并行的一章时,看到作者首先对并发(Concurrency)和并行(Parallelism)的区别进行了定义和解释。以前我对这个问题也是一知半解,如果有人问题这个问题,恐怕我只能挠头说不清楚。而在这本书里,作者的解释是(简单翻译):一个并发程序是指能同时执行通常不相关的各种任务。以一个游戏服务器为例子:它通常是有各种组件组成,每种组件都跟外部世界进行着复杂的信息交互。一个组件有可能要处理多个用户聊聊;另外一些可能要处理用户的输入,并把最新状态反馈给用户;其它的用来进行物理计算。这些都是并发处理。并发程序并不需要多核处理器。相比之下,并行程序是 阅读全文