线程中的同步辅助类Semaphore

简介:

同步辅助类  线程池  并发集合类 都是在线程同步的基础上增加了一些同步的东西,在线程同步的基础上更好的实现线程同步.实现的效率更高,更方便而已.

多线程并不是很难 需要你把代码写出来...然后分析运行的效果.

软件包 java.util.concurrent   JDK1.5之后才出现的.  同步辅助类提供了更优秀的解决方案.

 同步器

四个类可协助实现常见的专用同步语句。

Semaphore 是一个经典的并发工具。

CountDownLatch 是一个极其简单但又极其常用的实用工具,用于在保持给定数目的信号、事件或条件前阻塞执行。

CyclicBarrier 是一个可重置的多路同步点,在某些并行编程风格中很有用。

Exchanger 允许两个线程在 collection 点交换对象,它在多流水线设计中是有用的。

 

类 Semaphore

一个计数信号量。从概念上讲,信号量维护了一个许可集。

 

Semaphore中维护了一个可许集,这个可许集的体现就是构造方法中传入一个int值

 final Semaphore semaphore = new Semaphore(5);

 

         信号量:Semaphore。

                   允许临界区(共享内容)内存在固定个数的线程,并发访问。

                   如果信号量为1.成为二进制信号量,和同步(synchronized) 效果一样。

场景:

 一个混沌摊,一开始只有一个桌子,一张桌子同时只能被一个人使用,只有拿到许可之后才可以使用这个桌子.   后来有了5个桌子,最多能允许5个拿到许可的人同时访问. 

复制代码
 1 import java.util.Random;
 2 import java.util.concurrent.Semaphore;
 3 import java.util.concurrent.TimeUnit;
 4 
 5 public class SemaphoreDemo {
 6 
 7     public static void main(String[] args) {
 8         final Semaphore semaphore = new Semaphore(5);
 9         //Semaphore中维护了一个可许集,这个可许集的体现就是构造方法中传入一个int值
10         //有5个许可,同时允许5个线程同时来拿
11         
12         for (int i = 0; i < 50; i++) {
13 
14             new Thread(new Runnable() {
15 
16                 @Override
17                 public void run() {
18                     try {
19                         semaphore.acquire();//获得一个许可,从5减去1,有许可的才让访问
20                     } catch (InterruptedException e1) {
21                         e1.printStackTrace();
22                     }
23                     System.out.println(Thread.currentThread().getName()
24                             + " :来了,现在有 "+(5-semaphore.availablePermits())+" 名顾客");//有几名顾客就意味着有多少个并发.
25 
26                     try {
27                         TimeUnit.SECONDS.sleep(new Random().nextInt(3));
28                     } catch (InterruptedException e) {
29                         e.printStackTrace();
30                     }
31 
32                     System.out.println("-->" + Thread.currentThread().getName()
33                             + " :走了");
34                     
35                     semaphore.release();//释放许可
36                 }
37             }).start();
38 
39         }
40     }
41 }
复制代码

 


本文转自SummerChill博客园博客,原文链接:http://www.cnblogs.com/DreamDrive/p/6206238.html,如需转载请自行联系原作者

相关文章
|
23小时前
|
安全 Java
Java多线程集合类
本文介绍了Java中线程安全的问题及解决方案。通过示例代码展示了使用`CopyOnWriteArrayList`、`CopyOnWriteArraySet`和`ConcurrentHashMap`来解决多线程环境下集合操作的线程安全问题。这些类通过不同的机制确保了线程安全,提高了并发性能。
|
12天前
|
Java 调度
Java 线程同步的四种方式,最全详解,建议收藏!
本文详细解析了Java线程同步的四种方式:synchronized关键字、ReentrantLock、原子变量和ThreadLocal,通过实例代码和对比分析,帮助你深入理解线程同步机制。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
Java 线程同步的四种方式,最全详解,建议收藏!
|
17天前
|
Java 开发者
在Java多线程编程中,创建线程的方法有两种:继承Thread类和实现Runnable接口
【10月更文挑战第20天】在Java多线程编程中,创建线程的方法有两种:继承Thread类和实现Runnable接口。本文揭示了这两种方式的微妙差异和潜在陷阱,帮助你更好地理解和选择适合项目需求的线程创建方式。
13 3
|
17天前
|
Java
在Java多线程编程中,实现Runnable接口通常优于继承Thread类
【10月更文挑战第20天】在Java多线程编程中,实现Runnable接口通常优于继承Thread类。原因包括:1) Java只支持单继承,实现接口不受此限制;2) Runnable接口便于代码复用和线程池管理;3) 分离任务与线程,提高灵活性。因此,实现Runnable接口是更佳选择。
29 2
|
17天前
|
Java
Java中多线程编程的基本概念和创建线程的两种主要方式:继承Thread类和实现Runnable接口
【10月更文挑战第20天】《JAVA多线程深度解析:线程的创建之路》介绍了Java中多线程编程的基本概念和创建线程的两种主要方式:继承Thread类和实现Runnable接口。文章详细讲解了每种方式的实现方法、优缺点及适用场景,帮助读者更好地理解和掌握多线程编程技术,为复杂任务的高效处理奠定基础。
27 2
|
17天前
|
Java 开发者
Java多线程初学者指南:介绍通过继承Thread类与实现Runnable接口两种方式创建线程的方法及其优缺点
【10月更文挑战第20天】Java多线程初学者指南:介绍通过继承Thread类与实现Runnable接口两种方式创建线程的方法及其优缺点,重点解析为何实现Runnable接口更具灵活性、资源共享及易于管理的优势。
26 1
|
1月前
|
存储 消息中间件 资源调度
C++ 多线程之初识多线程
这篇文章介绍了C++多线程的基本概念,包括进程和线程的定义、并发的实现方式,以及如何在C++中创建和管理线程,包括使用`std::thread`库、线程的join和detach方法,并通过示例代码展示了如何创建和使用多线程。
39 1
C++ 多线程之初识多线程
|
17天前
|
Java 开发者
在Java多线程编程中,选择合适的线程创建方法至关重要
【10月更文挑战第20天】在Java多线程编程中,选择合适的线程创建方法至关重要。本文通过案例分析,探讨了继承Thread类和实现Runnable接口两种方法的优缺点及适用场景,帮助开发者做出明智的选择。
13 2
|
17天前
|
安全 Java 开发者
Java多线程中的`wait()`、`notify()`和`notifyAll()`方法,探讨了它们在实现线程间通信和同步中的关键作用
本文深入解析了Java多线程中的`wait()`、`notify()`和`notifyAll()`方法,探讨了它们在实现线程间通信和同步中的关键作用。通过示例代码展示了如何正确使用这些方法,并分享了最佳实践,帮助开发者避免常见陷阱,提高多线程程序的稳定性和效率。
28 1
|
17天前
|
Java
在Java多线程编程中,`wait()` 和 `notify()/notifyAll()` 方法是线程间通信的核心机制。
在Java多线程编程中,`wait()` 和 `notify()/notifyAll()` 方法是线程间通信的核心机制。它们通过基于锁的方式,使线程在条件不满足时进入休眠状态,并在条件成立时被唤醒,从而有效解决数据一致性和同步问题。本文通过对比其他通信机制,展示了 `wait()` 和 `notify()` 的优势,并通过生产者-消费者模型的示例代码,详细说明了其使用方法和重要性。
22 1

相关实验场景

更多
下一篇
无影云桌面