`

java线程:信号量

 
阅读更多

Java 信号量 Semaphore 介绍

Semaphore当前在多线程环境下被扩放使用,操作系统的信号量是个很重要的概念,在进程控制方面都有应用。Java 并发库 的Semaphore 可以很轻松完成信号量控制,Semaphore可以控制某个资源可被同时访问的个数,通过 acquire() 获取一个许可,如果没有就等待,而 release() 释放一个许可。比如在Windows下可以设置共享文件的最大客户端访问个数。

Semaphore实现的功能就类似厕所有5个坑,假如有10个人要上厕所,那么同时只能有多少个人去上厕所呢?同时只能有5个人能够占用,当5个人中 的任何一个人让开后,其中等待的另外5个人中又有一个人可以占用了。另外等待的5个人中可以是随机获得优先机会,也可以是按照先来后到的顺序获得机会,这取决于构造Semaphore对象时传入的参数选项。单个信号量的Semaphore对象可以实现互斥锁的功能,并且可以是由一个线程获得了“锁”,再由另一个线程释放“锁”,这可应用于死锁恢复的一些场合。

Semaphore维护了当前访问的个数,提供同步机制,控制同时访问的个数。在数据结构中链表可以保存“无限”的节点,用Semaphore可以实现有限大小的链表。另外重入锁 ReentrantLock 也可以实现该功能,但实现上要复杂些。

下面的Demo中申明了一个只有5个许可的Semaphore,而有20个线程要访问这个资源,通过acquire()和release()获取和释放访问许可。

package com.test;

import java.util.concurrent.ExecutorService;

import java.util.concurrent.Executors;

import java.util.concurrent.Semaphore;

public class TestSemaphore {

                public static void main(String[] args) {

                // 线程池

                ExecutorService exec = Executors.newCachedThreadPool();

                // 只能5个线程同时访问

                final Semaphore semp = new Semaphore(5);

                 // 模拟20个客户端访问

                 for (int index = 0; index < 20; index++) {

                              final int NO = index;

                              Runnable run = new Runnable() {

                                                 public void run() {

                                                            try {

                                                                    // 获取许可

                                                                    semp.acquire();

                                                                    System.out.println("Accessing: " + NO);

                                                                    Thread.sleep((long) (Math.random() * 10000));

                                                                    // 访问完后,释放

                                                                    semp.release();

                                                                    System.out.println("-----------------"+semp.availablePermits());

                                                            } catch (InterruptedException e) {

                                                                    e.printStackTrace();

                                                            }

                                                  }

                                      };

                      exec.execute(run);

             }

             // 退出线程池

             exec.shutdown();

       }

}

执行结果如下:

Accessing: 0

Accessing: 1

Accessing: 3

Accessing: 4

Accessing: 2

-----------------0

Accessing: 6

-----------------1

Accessing: 7

-----------------1

Accessing: 8

-----------------1

Accessing: 10

-----------------1

Accessing: 9

-----------------1

Accessing: 5

-----------------1

Accessing: 12

-----------------1

Accessing: 11

-----------------1

Accessing: 13

-----------------1

Accessing: 14

-----------------1

Accessing: 15

-----------------1

Accessing: 16

-----------------1

Accessing: 17

-----------------1

Accessing: 18

-----------------1

Accessing: 19

 

分享到:
评论

相关推荐

    Java多线程编程总结

    Java线程:概念与原理 ...Java线程:新特征-信号量 Java线程:新特征-阻塞队列 Java线程:新特征-阻塞栈 Java线程:新特征-条件变量 Java线程:新特征-原子量 Java线程:新特征-障碍器 Java线程:大总结

    java 线程同步 信号量控制同步

    信号量机制是 Java 中的一种线程同步机制。信号量是一个整数值,表示当前可用的资源数量。线程可以通过等待信号量来获取资源访问权限。信号量机制可以用于解决生产者-消费者问题、哲学家就餐问题等。 Java 中的 ...

    Java多线程编程经验

    #### 十六、Java线程:新特征-信号量 信号量是一种用于控制多个线程访问共享资源的机制,可以有效地限制并发访问的数量。 #### 十七、Java线程:新特征-阻塞队列 阻塞队列是一种特殊的队列,当队列为空时,从队列...

    Java 线程开发讲座

    #### 十四、Java线程:新特征-信号量 - **信号量**:用于控制对资源的访问次数,适用于多个资源的管理。 - **Semaphore类**:`Semaphore`类提供了信号量的功能。 #### 十五、Java线程:新特征-阻塞队列 - **阻塞...

    java多线程编程总结

    - **信号量** 通过 `Semaphore` 类来控制对有限资源的访问。 - **阻塞队列** `BlockingQueue` 提供了线程安全的队列实现,可以方便地用于生产者-消费者模型。 - **阻塞栈** `BlockingDeque` 类提供了一个线程...

    JavaMultiThreadingExamples:带有中文注释的基本Java多线程示例

    #Java多线程示例-Java多线程应用实例 1- Java多线程:启动线程 2- Java多线程:易失性–基本线程通信 3- Java多线程:同步 ...12- Java多线程:信号量 13- Java多线程:可调用和未来 14- Java多线程:中断线程 从分叉

    Java多线程

    #### 十六、Java线程:新特征-信号量 信号量是一种控制多个线程访问共享资源的方法,常用于限制可以访问某些资源的最大线程数。 #### 十七、Java线程:新特征-阻塞队列 阻塞队列是一种特殊的队列,它能够阻塞插入...

    Java_多线程编程线程:大总结

    - **信号量**:控制对有限资源的访问,如网络连接数限制。 - **阻塞队列**:用于线程间的数据交换,确保数据的正确性和安全性。 - **条件变量**:支持更复杂的线程同步场景。 - **原子量**:提供原子操作,避免了锁...

    JAVA 多线程之信号量(Semaphore)实例详解

    **JAVA 多线程之信号量Semaphore实例详解** 在Java多线程编程中,信号量Semaphore是一种非常重要的同步工具,用于控制对公共资源的访问。Semaphore类位于`java.util.concurrent`包下,它允许我们限制同时访问特定...

    MultithreadingJava:来自Cave of Programming http的John Purcell的Java多线程课程代码

    课程内容: 1- Java 多线程:启动线程 2- Java 多线程:Volatile – ...12- Java 多线程:信号量 13- Java 多线程:Callable 和 Future 14- Java 多线程:中断线程 15- Java 多线程:Swing 中的多线程与 SwingWorker

    Java进程信号量机制的实验程序

    Java进程信号量机制是多线程编程中一种有效的同步工具,它源于操作系统中的同步原语,用于管理和控制对共享资源的访问。在Java中,信号量由`java.util.concurrent.Semaphore`类实现,它提供了两种类型:可重用的二...

    JAVA多线程

    Java新特性中引入了线程池、`Future`和`Callable`接口支持有返回值的线程、高级锁机制、信号量、阻塞队列等,为多线程编程提供了更强大和灵活的支持。 综上所述,Java多线程编程涉及到线程的概念、创建与启动、线程...

    Java线程使用教程

    3. **Semaphore**:信号量,限制同时访问特定资源的线程数量。 4. **Atomic* 类**:提供原子操作的类,如`AtomicInteger`,保证在多线程环境下变量的更新不被中断。 五、死锁与活锁 1. **死锁**:两个或多个线程...

    Java多线程运算集合

    #### 十三、Java线程:新特征-信号量 - **信号量**: - 信号量是一种用于控制对共享资源访问次数的同步工具。 - Java中的 `Semaphore` 类可以用于限制多个线程访问共享资源的数量。 #### 十四、Java线程:新特征...

    java线程文档大全

    10. **信号量(Semaphore)**:信号量是一种同步工具,可以限制同时访问特定资源的线程数量。它通过acquire()和release()方法控制许可。 11. **有返回值的线程**:如果线程需要返回结果,可以使用Future和Callable...

    信号量机制实现线程同步

    6. **实际编程中的应用**:在Java中,可以使用`java.util.concurrent.Semaphore`类来实现信号量。创建时指定初始值,然后在线程中调用`acquire()`(等价于P操作)和`release()`(等价于V操作)方法来管理资源访问。 ...

    multithreading

    #Java多线程1- Java多线程:启动线程2- Java多线程:易失...Java多线程:低级生产者-消费者10- Java多线程:可重入锁11- Java多线程:死锁12- Java多线程:信号量13- Java多线程:可调用和未来14- Java多线程:中断线程

    关于线程(java)两天的课件

    Java提供了多种机制,如synchronized关键字、volatile变量、Lock接口(如ReentrantLock)以及信号量Semaphore。synchronized提供内置锁,保证同一时间只有一个线程访问临界区;volatile保证了变量在多线程环境中的...

    java线程与并发编程实践

    Java提供了一系列并发工具类,如Semaphore(信号量)、CyclicBarrier(循环屏障)、CountDownLatch(计数器门锁)和Exchanger(交换器),它们用于控制线程间访问资源的顺序和数量,协调多个线程间的操作。...

Global site tag (gtag.js) - Google Analytics