码迷,mamicode.com
首页 > 其他好文 > 详细

十分钟理解Actor模式

时间:2015-06-27 20:03:45      阅读:1011      评论:0      收藏:0      [点我收藏+]

标签:actor模型   erlang   scala   mapreduce   并发模型   

Actor模式是一种并发模型,与另一种模型共享内存完全相反,Actor模型share nothing。所有的线程(或进程)通过消息传递的方式进行合作,这些线程(或进程)称为Actor。共享内存更适合单机多核的并发编程,而且共享带来的问题很多,编程也困难。随着多核时代和分布式系统的到来,共享模型已经不太适合并发编程,因此几十年前就已经出现的Actor模型又重新受到了人们的重视。MapReduce就是一种典型的Actor模式,而在语言级对Actor支持的编程语言Erlang又重新火了起来,Scala也提供了Actor,但是并不是在语言层面支持,Java也有第三方的Actor包。


单核单机时代一般都是单线程编程,如果把程序比作一个工厂,那么只有一个工人,这个工人负责所有的事情,所有的原料,工具产品等都放到一个地方,因为只有一个人,因此使用一套工具就行,取原料也不用排队等。技术分享


到了多核时代,有多个工人,这些工人共同使用一个仓库和车间,干什么都要排队。比如我要从一块钢料切出一块来用,我得等别人先用完。有个扳手,另一个人在用,我得等他用完。两个人都要用一个切割机从一块钢材切一块钢铁下来用,但是一个人拿到了钢材,一个人拿到了切割机,他们互相都不退让,结果谁都干不了活。

技术分享

到了分布式系统时代,工厂已经用流水线了,每个人都有明确分工,这就是Actor模式。

技术分享


以一个找素数个数的例子来说,如果用Java代码如下:

public class PrimeCount implements Runnable {

	private int max;
	public PrimeCount(int max) {
		this.max = max;
	}
	
	private int currentNum = 2;
	private int totalPrimeCount = 0;
	
	private int incrCurrentNum() {
		int result;
		synchronized (this) {	      //如果不用锁,必然会出错。
			if(currentNum > max) {
				result = -1;
			} else {
				result = currentNum;
				currentNum++;
			}
			
		}
		return result;
	}
	private void accPrimeCount(int count) {
		synchronized (this) {
			totalPrimeCount += count;
		}
	}
	@Override
	public void run() {
		int primeCount = 0;
		int num;
		while((num=incrCurrentNum()) != -1) {
			if(isPrime(num)) {
				primeCount++;
			}
		}
		accPrimeCount(primeCount);
		
	}
	private boolean isPrime(int num) {
		for(int i = 2; i < num; i++) {
			if(num % i == 0) {
				return false;
			}
		}
		return true;
	}
	
	@SuppressWarnings("static-access")
	public static void main(String[] args){
		PrimeCount pc = new PrimeCount(10000);
		for(int i = 0; i < 10; i++) {
			new Thread(pc).start();
		}
		try {
			Thread.currentThread().sleep(5000);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		System.out.println(pc.getTotalPrimeCount());
	}
	public int getTotalPrimeCount() {
		return totalPrimeCount;
	}

}





本文出自 “牛哥的博客” 博客,请务必保留此出处http://nxlhero.blog.51cto.com/962631/1666250

十分钟理解Actor模式

标签:actor模型   erlang   scala   mapreduce   并发模型   

原文地址:http://nxlhero.blog.51cto.com/962631/1666250

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!