文档章节

生产者消费者模型的信号量+ReentrantLock的实现

Finley.Hamilton
 Finley.Hamilton
发布于 2012/10/11 16:56
字数 608
阅读 220
收藏 3
package cn.edu.sysu;

import java.util.ArrayList;
import java.util.concurrent.Semaphore;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

class ObjectQueue{
	
	private final int size=10;
	
	private final Semaphore notEmpty=new Semaphore(0);
	private final Semaphore notFull=new Semaphore(size);
	
	private ArrayList<Integer> ints=new ArrayList<Integer>();
	
	private Lock lock=new ReentrantLock();
	
	public ObjectQueue(){}
	
	public void putItem(Integer i){
		
		try {
			notFull.acquire();
			lock.lock();
			ints.add(i);
			notEmpty.release();
		} catch (Exception e) {
			System.out.println("Exception happened in object queue put item");
		}
		finally{
			lock.unlock();
		}
	}
	
	public Integer getItem(){
		
		try {
			notEmpty.acquire();
			lock.lock();
			Integer i=ints.remove(0);
			notFull.release();
			return i;
		} catch (Exception e) {
			System.out.println("Exception happened in object queue get item");
		}
		finally{
			lock.unlock();
		}
		return null;
	}
}

class Producer extends Thread{
	
	int id;
	ObjectQueue queue;
	public Producer(int i, ObjectQueue q){
		super();
		this.id=i;
		this.queue=q;
	}
	
	public void run() {
		for(int i=0;i<100;i++){
			queue.putItem(new Integer(i+10000));
			System.out.println("Producer "+id+" produce Integer "+(i+10000));
			try {
				Thread.currentThread().sleep(10);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
}


class Consumer extends Thread{
	
	int id;
	ObjectQueue queue;
	public Consumer(int i, ObjectQueue q){
		super();
		this.id=i;
		this.queue=q;
	}
	
	public void run() {
		for(int i=0;i<100;i++){
			Integer item=queue.getItem();
			System.out.println("Consumer "+id+" consume Integer "+item.intValue());
			try {
				Thread.currentThread().sleep(3000);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
}


public class LockImplmentation {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		ObjectQueue queue=new ObjectQueue();
		Producer p=new Producer(1,queue );
		int consumerCount=5;
		Consumer c[]=new Consumer[consumerCount];
		for(int i=0;i<consumerCount;i++){
			c[i]=new Consumer(i, queue);
			c[i].start();
		}
		p.start();
		
	}

}

要把心静下来的话还是应该去写一些基本的程序,虽然很简单,但是不失为笔试面试的有效材料,有点不规范的地方,但是我就是喜欢extends Thread,用Runnable的话好像还是不习惯多写几行。另外的话可以复习一下进程同步的知识


连什么是可重入锁都不知道就在那里瞎写:

可重入锁,最关键的地方是认识他

final Condition con = lock.newCondition();

之后所得到的condition调用await,和直接调用Thread.sleep的区别

前者是lock住了但是不保持这个锁(别人可以保持这个锁,到他回来的时候,就是重入了),后者不光是保持了这个锁,而且lock了这个锁(别人怎么也进不来了)

看这里:http://tenyears.iteye.com/blog/48750


官方:

如果该锁定没有被另一个线程保持,则获取该锁定并立即返回,将锁定的保持计数设置为 1。
如果当前线程已经保持该锁定,则将保持计数加 1,并且该方法立即返回。
如果该锁定被另一个线程保持,则出于线程调度的目的,禁用当前线程,并且在获得锁定之前,该线程将一直处于休眠状态,此时锁定保持计数被设置为 1。

© 著作权归作者所有

共有 人打赏支持
Finley.Hamilton

Finley.Hamilton

粉丝 5
博文 45
码字总数 15431
作品 0
广州
私信 提问
Java生产者和消费者模型的5种实现方式

前言 生产者和消费者问题是线程模型中的经典问题:生产者和消费者在同一时间段内共用同一个存储空间,生产者往存储空间中添加产品,消费者从存储空间中取走产品,当存储空间为空时,消费者阻...

Airship
01/09
0
0
操作系统 — 生产者消费者模型

生产者消费者模型 所谓的生产者消费者模型就是一个类似于队列一样的东西串起来,这个队列可以想像成一个存放产品的"仓库",生产者只需要关心这个"仓库",并 不需要关心具体的消费者,对于生产...

Dawn_sf
2018/01/21
0
0
Linux 下多线程的消费者-生产者模型

消费者-生产者模型 所谓这个模型指在ipc时,由扮演的生产者进程产生数据,由扮演消费者的进程去拿走数据。 这个模型是由3种关系俩种角色一个场景所描述而成。 三种关系指: 消费者-消费者 --...

sdoyuxuan
2017/06/07
0
0
线程间同步之信号量实现环形buf

一.概述: 信号量是一个非负整数的计数器,它通过计数器来实现多线程对临界资源的顺序访问,从而实现线程间的同步。它与进程间通信的信号量不同,进程间通信的信号量是一个信号量集,而线程间...

余二五
2017/11/07
0
0
Linux系统中的信号量机制

1、信号量的定义: 在linux中,信号量用上述结构体表示,我们可以通过该结构体定义一个信号量。 2、信号量的初始化: 可用void sema_init(struct semaphore *sem, int val);直接创建,其中v...

宅蓝三木
2014/04/24
0
0

没有更多内容

加载失败,请刷新页面

加载更多

中国龙-扬科
35分钟前
0
0
使用apicloud开发移动端APP,IOS list页面滚动卡顿解决记录

给内容容器添加样式:-webkit-overflow-scrolling:touch; -webkit-overflow-scrolling:属性控制元素在移动设备上是否使用滚动回弹效果. auto:使用普通滚动, 当手指从触摸屏上移开,滚动会立即...

万建宁
37分钟前
0
0
Akka消息传送可靠性 23

原文:https://doc.akka.io/docs/akka/2.5/general/message-delivery-reliability.html Akka可帮助您构建可靠的应用程序,这些应用程序在一台计算机中使用多个处理器核心或分布在计算机网络中...

woshixin
59分钟前
2
0
composer安装

前言:随着开源的东西越来越多,一些好的代码我们是可以直接拿过来用的,github更是加快了这一节奏,在github上我们可以看到一些开源的项目、代码块、函数库、类结构等,我们可以直接Fork,然...

echojson
今天
4
0
mysql grant 用户权限总结

用户权限管理主要有以下作用: 1. 可以限制用户访问哪些库、哪些表 2. 可以限制用户对哪些表执行SELECT、CREATE、DELETE、DELETE、ALTER等操作 3. 可以限制用户登录的IP或域名 4. 可以限制用...

Airship
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部