线程同步模型, 生产者/消费者, 读写同步,线程池,concurrent map.
2008-04-16 18:41
316 查看
之前写了一篇线程同步的原理分析的文章.
请点击左边广告
看到大家的反馈,感到深受鼓励.
看来这种举例说明本质原理的浅显易懂的文章, 还是比较受欢迎的.
关于线程, 我以前也写过一些文章.只是写得不那么清楚易懂.
一是因为自己的理解也有限, 二是很难找到灵感,很难写出一个非常贴切的例子.
应一些坛友的意见. 我这里继续发一些线程相关的内容.
内容的条理性和连贯性可能有些欠缺.
-------------------------------------------------------------------------
生产者/消费者模型
有了信号量这个利器,我们就可以处理比较复杂的线程同步模型了。
首先,我们来看一个比较简单的生产者/消费者模型。还是以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的语言,内部实现原理也是采用类似的信号量同步机制。
请点击左边广告
看到大家的反馈,感到深受鼓励.
看来这种举例说明本质原理的浅显易懂的文章, 还是比较受欢迎的.
关于线程, 我以前也写过一些文章.只是写得不那么清楚易懂.
一是因为自己的理解也有限, 二是很难找到灵感,很难写出一个非常贴切的例子.
应一些坛友的意见. 我这里继续发一些线程相关的内容.
内容的条理性和连贯性可能有些欠缺.
-------------------------------------------------------------------------
生产者/消费者模型
有了信号量这个利器,我们就可以处理比较复杂的线程同步模型了。
首先,我们来看一个比较简单的生产者/消费者模型。还是以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的语言,内部实现原理也是采用类似的信号量同步机制。
相关文章推荐
- 生产者/消费者模型、读写模型、线程池
- Java Note: 多线程的同步(互斥锁)的方法对比,信号量锁,读写锁的实现,生产者-消费者模式的实现
- Linux多线程之同步2 —— 生产者消费者模型
- 线程池 队列生产者消费者模型实现
- Java线程同步:生产者-消费者 模型(代码示例)
- Java Note: 多线程的同步(互斥锁)的方法对比,信号量锁,读写锁的实现,生产者-消费者模式的实现
- python进阶之多线程(进程)同步执行的消费者与生产者模型
- 线程同步之经典生产者-消费者模型
- 线程同步:生产者与消费者模型
- 多线程的同步与互斥机制(生产者&消费者模型)
- 从生产者-消费者模型了解线程、同步、锁(java)
- Java线程同步:生产者-消费者 模型(代码示例)
- 004-线程同步问题引出、同步问题解决、死锁、生产者与消费者
- 从java多线程实现“生产者-消费者”模型来谈谈操作系统中线程状态的转换及线程同步的总结
- 异步之生产者消费者模型--同步缓冲区的实现
- Java Note: 多线程的同步(互斥锁)的方法对比,信号量锁,读写锁的实现,生产者-消费者模式的实现
- 线程的同步与互斥(生产者与消费者模型)
- Linux多线程之同步2 —— 生产者消费者模型
- (生产者消费者)线程池、 多线程读写线程
- Linux互斥与同步应用(三):posix线程实现单个生产者和单个消费者模型