zoukankan      html  css  js  c++  java
  • Java Semaphore Example

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

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

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

    Example:

    View Code
     1 package com.my.hqb;
     2 
     3 import java.text.SimpleDateFormat;
     4 import java.util.Date;
     5 import java.util.concurrent.Semaphore;
     6 
     7 public class SemaphoreExample implements Runnable{
     8     
     9     private Semaphore semaphore;
    10     
    11     public SemaphoreExample(Semaphore semaphore) {
    12         this.semaphore = semaphore;
    13     }
    14     
    15     @Override
    16     public void run() {
    17         try {
    18             this.semaphore.acquire();
    19             
    20             printMessage();
    21             Thread.sleep(5000);
    22             
    23             this.semaphore.release();
    24         } catch (InterruptedException e) {
    25             // TODO Auto-generated catch block
    26             e.printStackTrace();
    27         }
    28         
    29     }
    30 
    31     private void printMessage() {
    32         SimpleDateFormat format = new SimpleDateFormat("hh:mm:ss");
    33         
    34         System.out.println("I have access now, " + Thread.currentThread().getName() + ", " + format.format(new Date()));
    35     }
    36 
    37     public static void main(String[] args) {
    38         Semaphore semaphore = new Semaphore(3);
    39         
    40         for (int i = 0; i < 10; i++) {            
    41             new Thread(new SemaphoreExample(semaphore)).start();
    42         }
    43     }
    44 }
  • 相关阅读:
    LeetCode 230. Kth Smallest Element in a BST
    LeetCode 114. Flatten Binary Tree to Linked List
    LeetCode 222. Count Complete Tree Nodes
    LeetCode 129. Sum Root to Leaf Numbers
    LeetCode 113. Path Sum II
    LeetCode 257. Binary Tree Paths
    Java Convert String & Int
    Java Annotations
    LeetCode 236. Lowest Common Ancestor of a Binary Tree
    LeetCode 235. Lowest Common Ancestor of a Binary Search Tree
  • 原文地址:https://www.cnblogs.com/BenWong/p/2958931.html
Copyright © 2011-2022 走看看