原文地址:
http://www.java2000.net/p11622上次使用了自己设计的结构,实现了一个方法,只能被2个线程同时使用
经网友提醒,发现用信号量才是正途,我这里只给出测试代码和运行效果,其它的大家自己看吧
- package concurrent;
- import java.util.concurrent.Semaphore;
- public class SemaphoreTest extends Thread {
- public static void main(String[] args) {
- for (int i = 0; i <= 10; i++) {
- new SemaphoreTest().start();
- }
- }
- public void run() {
- int i = 2;
- OnlyTwo ot = new OnlyTwo();
- while (i-- > 0) {
- System.out.printf("[%3d]%d=%d\n",this.getId(),System.currentTimeMillis(),+ot.getSomthing());
- try {
- Thread.sleep(200);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- ot.returnSomthing();
- }
- }
- }
- class OnlyTwo {
- private static final int MAX_AVAILABLE = 3;
- private static final Semaphore available = new Semaphore(MAX_AVAILABLE, false);
- private static int NUM = 1;
-
- public int getSomthing() {
- try {
- available.acquire();
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- return NUM++;
- }
-
- public void returnSomthing() {
- available.release();
- }
- }
运行效果
[ 9]1225837305234=1
[ 10]1225837305250=3
[ 8]1225837305250=2
[ 8]1225837305468=4
[ 10]1225837305468=6
[ 9]1225837305468=5
[ 12]1225837305250=7
[ 14]1225837305250=8
[ 16]1225837305250=9
[ 16]1225837305875=10
[ 12]1225837305875=12
[ 14]1225837305875=11
[ 18]1225837305250=13
[ 13]1225837305250=15
[ 11]1225837305250=14
[ 18]1225837306281=16
[ 13]1225837306281=18
[ 11]1225837306281=17
[ 15]1225837305250=19
[ 17]1225837305250=20
[ 17]1225837306687=21
[ 15]1225837306687=22
分享到:
相关推荐
使用信号量,可以实现多个读者同时读取,而写入时阻塞所有读写操作。 - **哲学家就餐问题**:五个哲学家围坐一桌,每个人需要同时拿起左右两边的筷子才能吃饭。通过信号量,可以防止他们同时拿起筷子导致死锁。 在...
Java 信号量Semaphore的实现 Java 信号量Semaphore是Java并发编程中的一种机制,用于控制多个线程的并发执行。Semaphore的实现主要是通过计数器来实现的,每个Semaphore对象都维护着一个计数器,用于记录当前可用的...
在C语言中,通常使用系统调用来实现信号量的操作。例如,POSIX标准提供了一套信号量API,包括`sem_init()`、`sem_wait()`、`sem_post()`等函数。 #### 三、信号量的实现 在给定的部分内容中,提供了两个示例程序:...
信号量Semaphore,这是一个在多线程编程中至关重要的同步机制,尤其在操作系统设计和并发编程领域,它扮演着协调多个线程对共享资源访问的角色。面试中被问及但回答不出,可能会显示出对并发控制理解的不足,因此,...
Semaphore是计数信号量。Semaphore管理一系列许可证。每个acquire方法阻塞,直到有一个许可证可以获得然后拿走一个许可证;每个release方法增加一个许可证,这可能会释放一个阻塞的acquire方法。然而,其实并没有...
Semaphore(信号量)是一种经典的同步机制,它源自于荷兰计算机科学家Edsger W. Dijkstra提出的银行家算法。本示例中,我们将深入探讨如何使用Semaphore来控制多线程的循序执行。 Semaphore是一种计数信号量,它...
综上所述,通过研究这些文件,我们可以学习到Minix操作系统中信号量的实现原理,以及如何在实际编程中使用它们来实现进程间的同步和通信。这对于理解操作系统内核、提升系统编程技能以及开发高效、可靠的多线程应用...
总结来说,使用信号量实现有限缓冲区的生产者和消费者问题以及读进程具有优先权的读者和写者问题,关键在于正确地设计和操作信号量,确保并发进程的正确同步和互斥。在Linux下,C语言提供了丰富的接口支持信号量的...
以下是一个简单的MFC工程中使用信号量的步骤: 1. 定义信号量:在类中声明一个`HANDLE`类型的成员变量,用于存储信号量句柄。 2. 初始化信号量:在类的构造函数中,调用`CreateSemaphore`函数初始化信号量,指定...
在多线程环境下,当多个线程尝试访问同一资源时,可以使用信号量来控制: ```cpp void workerThread() { semaphore.acquire(); // 获取信号量,如果失败则等待 // 访问共享资源 // ... semaphore.release(); // ...
信号量机制是操作系统中一种...通过理解和正确使用信号量,开发者可以在多线程环境中有效地管理和保护共享资源,确保程序的正确性和效率。在实际编程中,结合其他同步机制,我们可以构建出更加健壮和高效的并发系统。
在使用信号量时,需要注意信号量的初始化和释放,确保信号量的正确使用。同时,也需要注意信号量的分类和操作,以便更好地使用信号量。 信号量是一种重要的同步机制,在多线程环境下可以用于保证资源的安全使用。...
信号量(Semaphore)是实现线程同步的一种有效工具,它源于早期的计算机操作系统理论,由荷兰计算机科学家Dijkstra提出。在Windows系统中,信号量作为内核对象被广泛使用,可以用来控制对共享资源的访问。 信号量的...
Python中的线程信号量(Semaphore)是多线程编程中的一种同步机制,它主要用于控制对共享资源的访问,以防止过多的线程同时访问而导致资源竞争。...在实际编程中,合理使用信号量能够显著提高程序的稳定性和效率。
3. **使用信号量解决并发问题** 以下是一个简单的例子,展示了如何使用信号量来控制同时执行的任务数量。在这个例子中,我们创建了一个信号量,初始值为2,然后启动了3个并发任务。每个任务在执行前都会调用`...
为了解决这个问题,我们通常会使用同步机制,而信号量(Semaphore)就是一种常用的同步工具。本项目"基于Linux的实现进程的信号量互斥申请"聚焦于如何在Linux操作系统环境下,利用信号量来实现进程间的互斥访问,...
下面以生产者-消费者问题为例,介绍如何使用信号量实现互斥和同步。 ##### 生产者-消费者问题 生产者-消费者问题是多线程编程中的一个经典问题。该问题包含两个线程:生产者线程负责生成数据并放入队列或缓冲区中...
Java并发库Semaphore可以很轻松完成信号量掌握,Semaphore可以掌握某个资源可被同时访问的个数,通过acquire()猎取一个许可,假如没有就等待,而release()释放一个许可。 例如,在Windows下可以设置共享文件的最大...
根据《利用semaphore实现shm进程通信》一文,主要的进程通信方式包括信号(signal)、信号量+共享存储区、管道、消息传递以及套接字(Socket)。其中,信号量结合共享存储区(ShareMemory)和消息传递统称为XSI IPC...