前言:
信号量是用来对某一共享资源所能访问的最大个数进行控制
代码示例一:
package com.example; import java.util.concurrent.Semaphore; /** * Created by Will Smith on 2016/6/16. */ public class TestSemaphore { public static void main(String[] strings){ /*** * 第二个测试示例: * 在第一个示例的基础上,将Semaphore的初始允许数由1改为了0 * **/ Semaphore semaphore = new Semaphore(1); for(int i=0; i<2; i++){ try { System.out.println(i + "================" + i); System.out.println(semaphore.availablePermits()); semaphore.acquire(); System.out.println(semaphore.availablePermits()); System.out.println(i + "================" + i); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println("================"); System.out.println(semaphore.availablePermits()); semaphore.release(); System.out.println(semaphore.availablePermits()); System.out.println("================"); } }
运行结果如下:
代码示例二:
package com.example; import java.util.concurrent.Semaphore; /** * Created by Will Smith on 2016/6/16. */ public class TestSemaphore { public static void main(String[] strings){ /*** * 第二个测试示例: * 在第一个示例的基础上,将Semaphore的初始允许数由1改为了0 * **/ Semaphore semaphore = new Semaphore(0); for(int i=0; i<2; i++){ try { System.out.println(i + "================" + i); System.out.println(semaphore.availablePermits()); semaphore.acquire(); System.out.println(semaphore.availablePermits()); System.out.println(i + "================" + i); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println("================"); System.out.println(semaphore.availablePermits()); semaphore.release(); System.out.println(semaphore.availablePermits()); System.out.println("================"); } }
运行结果如下:
代码示例三:
package com.example; import java.util.concurrent.Semaphore; /** * Created by Will Smith on 2016/6/16. */ public class TestSemaphore { public static void main(String[] strings){ /*** * 第三个测试示例: * 在第二个示例的基础上,将semaphore.acquire()和semaphore.release()的位置互换了一下 * **/ Semaphore semaphore = new Semaphore(0); for(int i=0; i<2; i++){ System.out.println(i + "================" + i); System.out.println(semaphore.availablePermits()); semaphore.release(); System.out.println(semaphore.availablePermits()); System.out.println(i + "================" + i); } try { System.out.println("================"); System.out.println(semaphore.availablePermits()); semaphore.acquire(); System.out.println(semaphore.availablePermits()); System.out.println("================"); } catch (InterruptedException e) { e.printStackTrace(); } } }
运行结果如下:
总结:
1>
Semaphore semaphore = new Semaphore(1);
其中的初始值 1 表示当前的信号量当前所允许访问的线程数;
并且这个初始值 1 是可以通过semaphore.acquire()或semaphore.release()函数进行改变的,
简而言之,就是信号量的初始值是可以进行改变的,不会因信号量的初始值而限制;
2>
semaphore.acquire()是获得一个许可,若信号量中的许可数已为0,则这个函数会出现等待的状况;
若已获取许可,则这个信号量的许可数为减一;
semaphore.release()是释放一个许可,若之前信号量的许可数已为0,那么当调用
http://blog.csdn.net/u010661782/article/details/51679120semaphore.release()
函数时,则此时的信号量中的许可数就会变为1;简而言之,就是将这个信号量中的许可数在原来的基础上
增加一个,而无论信号量之前的初始值是什么;
3>
semaphore.availablePermits()表示信号量semaphore此刻所拥有的许可数的个数
参考文档:
http://www.apihome.cn/api/java/Semaphore.html
相关推荐
Java多线程编程是开发高并发应用的关键技术之一,Semaphore工具是Java并发包(java.util.concurrent)中的一个重要组件,用于控制同时访问特定资源的线程数量。本篇将深入讲解Semaphore的基本概念、工作原理以及如何...
总结一下,Semaphore的主要知识点包括: 1. **Semaphore是一个计数信号量**:它可以维护一个许可计数,线程在执行特定操作前需要获取一个许可。 2. **许可证管理**:`acquire()`用于获取一个许可,如果没有可用的...
Java知识点总结文档全面涵盖了多个Java相关的技术领域,包括JVM、Java集合框架、多线程并发、基础语法、Spring框架的原理、微服务、Netty与RPC通信、网络编程、日志管理、分布式协调工具Zookeeper、大数据存储系统如...
总结来说,Semaphore在Java并发编程中扮演着重要的角色,它提供了对资源访问的有效控制,避免了过多的并发导致的问题,实现了线程之间的协作和同步。在实际开发中,根据需求合理地使用Semaphore可以帮助优化系统的...
4. **并发编程**:Java并发库包括并发容器(如ConcurrentHashMap、CopyOnWriteArrayList)、并发工具类(如CountDownLatch、CyclicBarrier、Semaphore)以及原子类(AtomicInteger、AtomicReference)。面试中可能会...
以下是对Java线程安全的深入总结: ### 一、线程安全的定义 线程安全是指当多个线程访问同一块代码时,如果每个线程都能得到预期的结果,且不产生数据不一致或同步问题,那么这块代码就被称为线程安全的。Java中的...
- Java提供了Thread类来创建和管理线程,同时JUC(Java Concurrency Utilities)提供更高级的并发工具,如ExecutorService、Semaphore、CountDownLatch等。 - synchronized关键字用于实现线程同步,防止数据竞争,...
3. **同步工具类**:Java并发包`java.util.concurrent`中的工具类,如`Semaphore`(信号量)、`CyclicBarrier`(回环栅栏)、`CountDownLatch`(倒计时器)和`FutureTask`(未来任务)等,提供了更灵活的线程同步和...
线程和并发是Java的强项,线程的创建(Thread类和Runnable接口)、线程同步(synchronized、volatile、Lock接口)以及并发工具类(如ExecutorService、Semaphore、CountDownLatch)都需要掌握。理解并发模型和JVM...
17. **并发编程**:深入研究Java并发库,如Semaphore、CountDownLatch、CyclicBarrier、Exchanger等工具类,以及Future和CompletableFuture。 18. **Junit和Mockito**:理解单元测试的重要性和使用Junit进行测试的...
4. **并发工具类**:Java 5及更高版本引入了`java.util.concurrent`包,包含各种并发工具,如`ExecutorService`、`Future`、`Semaphore`、`CountDownLatch`和`CyclicBarrier`等。这些工具可以帮助开发者更有效地管理...
### Java多线程编程总结 #### 一、Java线程:概念与原理 - **操作系统中线程和进程的概念** 当前的操作系统通常都是多任务操作系统,多线程是一种实现多任务的方式之一。在操作系统层面,进程指的是内存中运行的...
例如,`ThreadPoolExecutor`可以管理一组工作线程来执行任务,而`Semaphore`和`Lock`接口提供了资源的同步和互斥访问控制。 此外,`java.util.ArrayList`和`java.util.Collections`类提供了丰富的工具方法,用于...
- **并发容器**:如ConcurrentHashMap、BlockingQueue、Semaphore等,理解它们在多线程环境中的使用场景。 - **线程池**:理解ExecutorService和ThreadPoolExecutor的工作原理,知道如何合理配置线程池。 6. **...
"Java 综合面试总结" 在这份 Java 综合面试总结中,我们将涵盖 Java 的基础知识、Spring 框架、设计模式、Java 并发及 JVM 相关知识。...3. 并发工具(3 种):Java 中的并发工具包括 Atomic、Lock 和 Semaphore 等。
### Java多线程编程总结 #### 一、Java线程:概念与原理 1. **操作系统中线程和进程的概念** - 当前的操作系统通常为多任务操作系统,多线程是实现多任务的一种手段。 - **进程**:指内存中运行的应用程序,每个...
"黑马java面试题总结"很可能是一个包含了这些主题的资源包,旨在帮助Java开发者准备面试,提升对技术的理解和应用能力。 首先,Java基础知识是面试中的常考项,包括但不限于语法特性(如封装、继承、多态)、面向...
5. **多线程**:Java的并发编程是面试的常见话题,包括线程的创建、同步机制(如synchronized、wait/notify、Lock接口)、线程池的使用以及并发工具类(如CountDownLatch、CyclicBarrier、Semaphore)。 6. **设计...
本文将全面总结Java的所有关键课程,帮助你构建坚实的编程基础。 一、Java基础 Java的基础部分包括语法、数据类型、变量、运算符、流程控制和数组。学习Java首先要理解其面向对象的特性,如类、对象和封装。掌握...
Java学习资料总结主要聚焦在Java多线程领域,是一份深度探索Java并发编程的资源集合。这份资料旨在帮助初学者和有一定经验的开发者系统性地理解并掌握Java中的多线程概念和技术,提升并发编程能力。 首先,"前言...