`

信号量通过一个计数器控制对共享资源的访问

    博客分类:
  • java
 
阅读更多
package sync;

import java.util.concurrent.Semaphore;

/**
 * 公共数据
 * 
 */
class Shared {
	public static int count;
}

/**
 * 递减线程
 * 
 */
class DecThread implements Runnable {

	private Semaphore sem;
	private String name;

	DecThread(Semaphore sem, String name) {
		this.sem = sem;
		this.name = name;
		new Thread(this).start();
	}

	@Override
	public void run() {
		try {
			System.out.println(name + ":等待通行证..");
			sem.acquire();
			System.out.println(name + ":得到通行证");
			for (int i = 0; i < 5; i++) {
				Shared.count--;
				System.out.println(name + ":" + Shared.count);
				Thread.sleep(10);
			}
			sem.release();
			System.out.println(name + "释放通行证");
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}

}

/**
 * 递加线程
 * 
  */
class IncThread implements Runnable {

	private Semaphore sem;
	private String name;

	IncThread(Semaphore sem, String name) {
		this.sem = sem;
		this.name = name;
		new Thread(this).start();
	}

	@Override
	public void run() {
		try {
			System.out.println(name + ":等待通行证..");
			sem.acquire();
			System.out.println(name + ":得到通行证");
			for (int i = 0; i < 5; i++) {
				Shared.count++;
				System.out.println(name + ":" + Shared.count);
				Thread.sleep(10);
			}
			sem.release();
			System.out.println(name + "释放通行证");
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}

}

/**
 * 信号量通过一个计数器控制对共享资源的访问
 * 
 */
public class SemaphoreTest {
	public static void main(String[] args) {
		// 信号量通过一个计数器控制对共享资源的访问
		Semaphore sem = new Semaphore(1);
		// 新启线程,传入信号量
		new IncThread(sem, "Inc");
		new DecThread(sem, "Dec");
	}
}
//输出
Inc:等待通行证..
Inc:得到通行证
Dec:等待通行证..
Inc:1
Inc:2
Inc:3
Inc:4
Inc:5
Inc释放通行证
Dec:得到通行证
Dec:4
Dec:3
Dec:2
Dec:1
Dec:0
Dec释放通行证

 

分享到:
评论

相关推荐

    ucos-ii学习笔记——信号量的原理及使用

    每当一个任务想要访问共享资源时,需要先获取信号量,如果信号量的计数器大于0,则允许任务访问共享资源。否则,任务需要等待直到信号量的计数器大于0。 三、信号量的使用 信号量的使用可以分为两步:创建信号量和...

    c++多线程同步——信号量

    信号量(Semaphore)是实现多线程同步的一种有效工具,常用于控制对共享资源的访问。在这个名为"Mthread11"的MFC工程中,我们可以看到如何在C++环境中应用信号量来解决多线程间的同步问题。 首先,我们需要理解什么...

    STM32的UCOSII信号量程序,亲测可用

    信号量是RTOS中的一个关键同步工具,用于控制对共享资源的访问,避免数据竞争和死锁现象。以下是关于STM32和UCOSII信号量的一些关键知识点: 1. **信号量概念**:信号量是一种计数器,可以是整数值,用于表示某种...

    Visual C++信号量线程同步的简单实例工程

    信号量是一种同步原语,用于控制多个线程对共享资源的访问。它可以看作是一种计数器,当计数值大于零时,线程可以获取资源;当计数值为零时,线程会被阻塞,直到计数器再次变为非零。在Windows API中,我们可以使用...

    VC多线程编程,利用信号量进行控制

    线程间的有效通信是多线程程序设计的关键,而信号量(Semaphore)作为一种同步机制,被广泛用于控制对共享资源的访问。 信号量是一种计数器,可以用来控制对有限资源的并发访问。在多线程环境中,当资源数量有限,...

    ucosii 互斥信号量

    1. 信号量:在操作系统中,信号量是一种计数器,可以用来控制对临界区的访问。在UCOSII中,信号量分为二进制信号量和互斥信号量两种。二进制信号量只有0和1两个状态,而互斥信号量则允许有非零的计数值,但通常只在0...

    ucosIII信号量多值信号量二值信号量互斥信号量

    多值信号量允许多个任务同时访问共享资源,信号量的计数器值可以大于1。这种方式非常适合处理多个任务并发访问的情况。例如,在一个系统中有多个任务需要访问网络接口,每个任务可以获取信号量来发送数据包,当信号...

    MFC关于信号量的例子

    信号量是一个同步原语,用于控制对共享资源的访问,它可以看作是一种计数器,可以增加或减少。当计数值为正时,线程可以获取信号量并进行操作;当计数值为0时,其他试图获取信号量的线程会被阻塞,直到信号量的值...

    vxwork命名信号量锁vxwork命名信号量锁vxwork命名信号量锁

    信号量是一种计数器,它可以是整数值,用于控制多个任务对共享资源的访问。当一个任务使用资源时,信号量的值会减一;当任务完成资源使用后,信号量会加一。如果信号量的值为零,表示资源正在被使用,其他试图获取...

    VXWORKS实时操作系统中信号量用于多任务同步与互斥的讨论.pdf

    信号量(Semaphore)是操作系统中用于多任务同步和互斥的机制之一,其基本思想是通过一个或多个信号量变量来控制对共享资源的访问。信号量可以被看作是一个计数器,用来表示资源的可用数。当任务需要访问共享资源时...

    Linux信号量1

    信号量机制通过控制计数器的增减,实现了对共享资源的访问控制,有效地解决了多进程并发访问的同步问题。在编写多线程或多进程的Linux程序时,合理使用信号量可以避免数据竞争,提高系统的稳定性和效率。

    电子-深入理解和实现RTOS连载9信号量应用演示.pdf

    信号量是一个计数器,用于多线程环境下的同步控制访问共享资源。在给定文件中,我们看到的是关于RTOS中信号量应用的演示。在深入讲解之前,先简要回顾下RTOS以及信号量的基本概念。 RTOS是一种设计用于管理计算机...

    Minix中实现信号量

    信号量是一种计数器,可以用于保护共享资源。在Minix中,信号量分为两种类型:二进制信号量和计数信号量。二进制信号量只有两个状态,0表示资源不可用,1表示资源可用;计数信号量则可以有任意非负整数值,表示资源...

    sem.rar_信号量_嵌入式系统

    信号量是一种资源管理工具,用于控制多个任务或线程对共享资源的访问。在多任务环境中,当多个任务可能同时尝试访问同一资源时,就需要一种机制来防止数据竞争和不一致的情况发生。这就是信号量的基本功能——通过...

    ucos学习篇之信号量

    信号量在UCOSII中扮演着关键的角色,它是一种计数器,可以用来控制对共享资源的访问。信号量分为两种类型:二进制信号量和计数信号量。二进制信号量只有0和1两个状态,通常用于实现互斥,即只有一个任务可以访问某个...

    很全面的资料:Linux之信号量

    信号量的核心思想是通过一个计数器来控制对共享资源的访问。当计数器为正时,表示资源是可用的,进程可以获取并使用资源;如果计数器为0,则表明资源已被占用,尝试访问的进程会被挂起,进入等待队列,直到有其他...

    LINUX 内核信号量设计与实现

    Linux内核中的信号量机制主要用于解决多线程或多进程之间对共享资源的访问冲突问题。在Linux内核中,信号量机制主要包括两个核心操作:`down` 和 `up` 函数。`down` 函数用于请求信号量,如果信号量可用,则进程可以...

    信号量Demo

    当线程需要访问共享资源时,它会调用dispatch_semaphore_wait,这将使线程等待,直到信号量计数器大于0。访问完成后,线程调用dispatch_semaphore_signal,增加计数器,允许其他等待的线程继续执行。 例如,在这个...

    ucosii 信号量创建请求等待

    在UCOSII中,信号量是一种重要的同步机制,用于控制对共享资源的访问或协调不同任务间的操作。本篇文章将深入探讨UCOSII中的信号量创建及请求等待的相关知识点。 一、信号量的概念 信号量在UCOSII中扮演着资源...

Global site tag (gtag.js) - Google Analytics