欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

线程同步模型, 生产者/消费者, 读写同步,线程池,concurrent map. 博客分类: Design 多线程thread数据结构log4j编程 

程序员文章站 2024-03-18 20:54:34
...

之前写了一篇线程同步的原理分析的文章.

线程同步
http://www.iteye.com/topic/164905

看到大家的反馈,感到深受鼓励.
看来这种举例说明本质原理的浅显易懂的文章, 还是比较受欢迎的.
关于线程, 我以前也写过一些文章.只是写得不那么清楚易懂.
一是因为自己的理解也有限, 二是很难找到灵感,很难写出一个非常贴切的例子.

应一些坛友的意见. 我这里继续发一些线程相关的内容.
内容的条理性和连贯性可能有些欠缺.

-------------------------------------------------------------------------

生产者/消费者模型

有了信号量这个利器,我们就可以处理比较复杂的线程同步模型了。
首先,我们来看一个比较简单的生产者/消费者模型。还是以Java代码为例。

public static final Object signal = new Object();
public static final char[] buf = new char[1024]; // 需要同步访问的共享资源

// 生产者代码
… produce() {

  for(… ) { // 循环执行

  synchronized(signal){
      // 产生一些东西,放到 buf 共享资源中

      signal.notify(); //然后通知消费者
      signal.wait(); // 然后自己进入signal待召队列
  }
  }
}

// 消费者代码
… consume() {

  for(… ) { // 循环执行

  synchronized(signal){

      signal.wait(); // 进入signal待召队列,等待生产者的通知

      // 读取buf 共享资源里面的东西

      signal.notify(); // 然后通知生产者
  }
  }
}

上述的生产者/消费者模型的实现非常简单,只用了一个信号量signal。这只是一段示意代码。
实际上的生产者/消费者模型的实现可能非常复杂。可以引入buf已满或者已空的判断,可以引入更多的信号量,也可以引入一个环状的buf链。但那些都是性能优化方面的工作,基本的信号量工作方式还是不变的。
生产者/消费者模型是典型的Coroutine。而且,当消费者或者生产者线程进入待召队列的时候,当前的运行栈状态就暂时保存在系统当中,这种状况又是典型的Continuation。
因此,我们完全可以用信号量机制自己实现Coroutine和Continuation。其实,那些在语法层面上支持Coroutine和Continuation的语言,内部实现原理也是采用类似的信号量同步机制。