http://zhidao.baidu.com/question/48694020
信号量
一、问题描述
生产者-消费者问题是一个经典的进程同步问题,该问题最早由Dijkstra提出,用以演示他提出的信号量机制。
他要求设计在同一个进程地址空间内执行的两个线程。
生产者线程生产物品,然后将物品放置在一个空缓冲区中供消费者线程消费。
消费者线程从缓冲区中获得物品,然后释放缓冲区。
当生产者线程生产物品时,如果没有空缓冲区可用,那么生产者线程必须等待消费者线程释放出一个空缓冲区。
当消费者线程消费物品时,如果没有满的缓冲区,那么消费者线程将被阻塞,直到新的物品被生产出来。
package examples.ch06.example01;
import java.util.LinkedList;
import java.util.concurrent.Semaphore;
/**
* @author Administrator
*
*/
public class TestSemaphore {
static Warehouse buffer = new Warehouse();
/**
* @param args
*/
public static void main(String[] args) {
for (int i = 0; i < 10; i++) {
Thread producer = new Thread(new Producer());
producer.start();
}
for (int i = 0; i < 15; i++) {
Thread consumer = new Thread(new Consumer());
consumer.start();
}
}
static class Producer implements Runnable {
static int i = 0;
@Override
public void run() {
while (true) {
i++;
try {
buffer.put(i);
System.out.println("put: " + i+" in thread: "+Thread.currentThread());
Thread.sleep(500);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
static class Consumer implements Runnable {
@Override
public void run() {
while (true) {
try {
Object x = buffer.take();
System.out.println("take: " + x+" in thread: "+Thread.currentThread());
Thread.sleep(1000);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
static class Warehouse {
// 非满锁,表示如果小于10,则说明仓库没有满。
final Semaphore notFull = new Semaphore(5);
// 非空锁,表示如果大于0,则说明仓库不为空。
final Semaphore notEmpty = new Semaphore(5);
// 核心锁,与lock()、unlock()相似
final Semaphore mutex = new Semaphore(1);
final LinkedList<Object> items = new LinkedList<Object>();
/**
* 添置商品到仓库中
*
* @param x
* @throws Exception
*/
public void put(Object x) throws Exception {
notFull.acquire();
System.out.println();
mutex.acquire();
System.out.println("notFull: " + notFull.availablePermits()
+ " mutex: " + mutex.availablePermits());
try {
items.addLast(x);
} finally {
mutex.release();
notFull.release();
}
}
public Object take() throws Exception {
notEmpty.acquire();
mutex.acquire();
System.out.println("notEmpty: " + notEmpty.availablePermits()
+ " mutex: " + mutex.availablePermits());
try {
// 减少库存
if (!items.isEmpty()) {
return items.remove();
}
return null;
} finally {
mutex.release();
notEmpty.release();
}
}
}
}
f
分享到:
相关推荐
1. java.util.concurrent - Java 并发工具包 2. 阻塞队列 BlockingQueue 3. 数组阻塞队列 ArrayBlockingQueue 4. 延迟队列 DelayQueue 5. 链阻塞队列 LinkedBlockingQueue 6. 具有优先级的阻塞队列 ...
java.util.concurrent - Java 并发工具包 2. 阻塞队列 BlockingQueue 3. 数组阻塞队列 ArrayBlockingQueue 4. 延迟队列 DelayQueue 5. 链阻塞队列 LinkedBlockingQueue 6. 具有优先级的阻塞队列 ...
Java.util.concurrent是Java 5.0引入的一个重要包,它为多线程编程提供了一组高级并发工具。这个包的设计者是Doug Lea,它的出现是JSR-166的一部分,也被称作Tiger更新。Java.util.concurrent的引入是为了解决传统...
Java平台在J2SE 1.5版本中引入了`java.util.concurrent`包,这是一系列中等层次的并发支持类集合,通过Java社区过程(Java Community Process, JCP)的Java规范请求(Java Specification Request, JSR)166创建而成...
java.util.concurrent 多线程框架 java.util.concurrent 多线程框架是 Java 语言中用于多线程编程的库。该库提供了多种线程池实现、并发集合、同步器、lock 等多种机制,以便开发者更方便地编写高效、可靠的多线程...
本资源包含两个 pdf 文档,一本根据 Jakob Jenkov 最新博客 (http://tutorials.jenkov.com/java-util-concurrent/index.html) 整理的 java_util_concurrent_user_guide_en.pdf,一个中文翻译的 java_util_concurrent...
关于AbstractQueuedSynchronizer,它是java.util.concurrent包中并发控制的核心组件,为Java并发工具类提供了底层机制支持,例如ReentrantLock、Semaphore、CountDownLatch等,都依赖于这个框架来实现同步。...
### Java.util.concurrent_您不知道的5件事 #### 1. Semaphore(信号量) - **定义与作用**:`Semaphore` 类是一种控制多个线程访问共享资源的机制,它通过内部维护一个整数计数器(许可的数量)以及一组等待线程...
Java并发工具包(java.util.concurrent)是Java平台上用于高效、安全地处理多线程编程的重要组件。这个包包含了丰富的并发工具类,旨在帮助开发者构建高度并发的程序,提高程序的性能和可伸缩性。本资源是该工具包的...
Java.util.concurrent(JUC)是Java平台中的一个核心包,专门用于处理多线程并发问题。这个包包含了大量的工具类和接口,极大地简化了并发编程的复杂性,提高了程序的性能和可伸缩性。本测试源文件主要是针对JUC并发...
《Java Util Concurrent中文版》是Java并发编程领域的重要参考资料,主要涵盖了Java标准库中的`java.util.concurrent`包及其相关类和接口。这个包是Java多线程编程的核心,提供了高效、安全的并发工具,帮助开发者...
总之,`java.util.concurrent` 提供的工具使得并发编程变得更加容易和高效,是 Java 并发编程的基石,无论是对于初学者还是经验丰富的开发者,理解和掌握这个包都是非常重要的。通过熟练运用这些工具,开发者可以...
Java.util.concurrent包(虽然不是直接在Java.util下,但密切相关)包含了一系列线程安全的数据结构和并发工具,如Semaphore、ExecutorService、CountDownLatch等,极大地简化了多线程编程。 8. **枚举Set**: ...
在Java编程领域,`java.util.concurrent`包是并发编程的核心工具包,提供了高效、线程安全的类和接口,使得开发者能够更容易地处理多线程环境。本篇将深入探讨这个包中一些鲜为人知的知识点,以帮助你提升并发编程的...
Java的`java.util.concurrent`包提供了丰富的线程工具,如`ExecutorService`、`Semaphore`、`CountDownLatch`等,帮助开发者高效地管理和控制并发。 以上各个模块的知识点相互独立,但又经常协同工作,共同构成了...
- `java.util.concurrent.Semaphore`用于控制对有限资源的访问。 ##### 5. 阻塞队列 - `java.util.concurrent.BlockingQueue`接口用于在线程间共享数据。 ##### 6. 条件变量 - `java.util.concurrent.locks....
8. **并发编程**:`java.util.concurrent`包虽然不在`java.util`下,但与之紧密相关,提供了高级并发工具,如ExecutorService、Future、Semaphore和CyclicBarrier。 9. **事件模型**:`java.util.EventObject`和`...
import java.util.concurrent.LinkedBlockingQueue; public class SafeBlockingQueue<T> { private final BlockingQueue<T> queue; public SafeBlockingQueue(int capacity) { this.queue = new ...
Java多线程编程是开发高并发应用的关键技术之一,Semaphore工具是Java并发包(java.util.concurrent)中的一个重要组件,用于控制同时访问特定资源的线程数量。本篇将深入讲解Semaphore的基本概念、工作原理以及如何...