以前在学操作系统时就接触过信号量(Semaphore['seməfɔ:])的概念,指的是多线程环境下保证一个或多个关键代码段不被并发调用。
举一个简单的例子可以帮助理解:比如车库的容量是有限的、同一时刻只能停100辆车、超过了100辆、其他的车辆就只能等待了。
在Jdk的java.util.concurrent包中已经实现了一个Semaphore类、我们可以直接拿来用、不需要再重复制造轮子了。
该类有如下一些特点:
1、Semaphore是带有Counting、相当于维护了一定数量的通行证、如上面举的例子里面的100辆车
2、该类的acquire方法是为了申请通行证的、该方法可能会Block(这里并没有使用synchronization、因为否则的话release也没法执行)、就是当通行证全部被申请完了之后。而对应的release方法则是释放通行证的、这样该方法执行后可能会让原来Block的acquire方法得以继续执行。
3、上面2的执行过程中其实并没有类似于通行证这样的对象、Semaphore只是维护了一个许可的计数器。
4、如果Semaphore的计数器为1(又叫binary Semaphore)的话则相当于一个互斥锁
实际应用中、对象池和线程池都有使用如此的方式控制线程的使用量。
下面是一个代码示例:
package com.alibaba.plouto.test.mock;
import java.util.concurrent.Semaphore;
public class TestSemaphore {
public static CarWarehouse carWarehouse = new CarWarehouse();
public static void main(String args[]) {
for (int i = 0; i <= 10; i++) {
new Thread(new Producer(i)).start();
new Thread(new Consumer()).start();
}
}
static class CarWarehouse {
final int MAX_PERMITS = 5;
final Semaphore permits = new Semaphore(MAX_PERMITS);
final Semaphore mutex = new Semaphore(1);
// 库存容量
final Object[] carWaits = new Object[MAX_PERMITS];
int count;
public void put(Object x) throws InterruptedException {
permits.acquire();
for (int i = 0; i < MAX_PERMITS; i++) {
if (carWaits[i] == null) {
//防止两辆车正好进同一个车位(当车库没满时、可以同时进多辆车)
mutex.acquire();
//通过Double Check防止细粒度的并发问题
if (carWaits[i] == null) {
carWaits[i] = x;
System.out.println("put " + carWaits[i]);
//停到了车位、释放互斥锁
mutex.release();
break;
} else {
//发现该车位满了、也需要释放互斥锁、继续寻找下一个位置
mutex.release();
}
}
}
}
public void take() throws InterruptedException {
int i = 0;
while (true) {
if (carWaits[i] != null) {
mutex.acquire();
if (carWaits[i] != null) {
System.out.println("take " + carWaits[i]);
carWaits[i] = null;
permits.release();
mutex.release();
break;
} else {
mutex.release();
}
}
i++;
if (i == MAX_PERMITS)
i = 0;
}
}
}
static class Producer implements Runnable {
private String car;
public Producer(int i) {
car = "car" + i;
}
public void run() {
try {
carWarehouse.put(car);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
static class Consumer implements Runnable {
public void run() {
try {
carWarehouse.take();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
分享到:
相关推荐
本篇文章将围绕Java多线程与并发编程的核心概念和技术进行深入探讨,帮助读者建立系统的知识体系,并掌握相关的实践方法。 #### 背景介绍 随着互联网应用规模的不断扩大,现代应用面临着高并发请求、CPU密集型操作...
Java多线程与并发编程是Java开发中至关重要的一部分,它涉及到如何高效地利用CPU资源,以实现程序的并行执行。在操作系统层面,多任务和多进程是通过分配不同的内存空间来实现的,而线程则共享同一进程的内存,这...
Java线程与并发编程实践是Java开发者必备的技能之一,特别是在多核处理器和高并发应用环境中,有效地管理和利用线程能极大地提升程序的性能。本书《java线程与并发实践编程》由Jeff Friesen撰写,2017年2月出版,...
Java多线程与并发编程是Java开发中不可或缺的一部分,它涉及到如何高效地利用CPU资源,实现并发执行多个任务。在操作系统层面,多线程是为了提高系统利用率,使得多个任务能够"同时"执行,但实际上,由于CPU的时钟...
Java 模拟线程并发是编程领域中的一个重要概念,尤其在多核处理器和高并发应用中,理解并熟练掌握线程并发技术对于提升程序性能至关重要。在Java中,线程并发可以通过多种方式实现,包括继承Thread类、实现Runnable...
Java多线程与并发编程是Java开发中的重要领域,它涉及到如何在单个程序中同时执行多个任务,以提高系统效率和性能。本资源主要涵盖了Java多线程的基础概念、核心API以及高级特性,旨在帮助Java开发者深入理解和掌握...
《深入学习:Java多线程编程》是一本专注于Java并发技术的专业书籍,旨在帮助开发者深入理解和熟练运用Java中的多线程编程。Java多线程是Java编程中的核心部分,尤其在现代高性能应用和分布式系统中不可或缺。理解并...
学习《汪文君JAVA多线程编程实战》不仅能够提高读者对Java多线程编程的理解,还有助于培养良好的并发编程习惯,避免常见的并发陷阱。对于想要提升自己在并发编程领域技能的Java开发者来说,这本书无疑是一份宝贵的...
Java多线程并发编程是Java开发中的重要领域,特别是在服务器端和高并发应用中不可或缺。`java.util.concurrent`包提供了丰富的工具类,帮助开发者更好地管理线程和优化并发性能。以下将详细介绍标题和描述中涉及的...
│ 高并发编程第一阶段05讲、采用多线程方式模拟银行排队叫号.mp4 │ 高并发编程第一阶段06讲、用Runnable接口将线程的逻辑执行单元从控制中抽取出来.mp4 │ 高并发编程第一阶段07讲、策略模式在Thread和Runnable...
《Java多线程编程实战指南-核心篇》是一本深入探讨Java并发编程的书籍,旨在帮助读者掌握在Java环境中创建、管理和同步线程的核心技术。Java的多线程能力是其强大之处,使得开发者能够在同一时间执行多个任务,提高...
在Java平台上,由于其本身提供了强大的并发编程支持,因此,掌握并发编程对于提高Java应用的性能和响应能力至关重要。 书中会首先介绍Java并发编程的基础知识,包括线程的创建和运行,同步机制的基本用法,以及Java...
在《java多线程并发编程核心技术应用实践》中,我们将深入探讨Java平台上的并发机制、线程安全与同步控制、线程池以及实战技巧。 首先,我们需要理解Java中的线程基础。线程是程序执行的最小单位,一个进程可以有多...
Java并发编程是Java开发中的重要领域,特别是在多核处理器和分布式系统中,高效地利用并发可以极大地提升程序的性能和响应速度。以下是对标题和描述中所提及的几个知识点的详细解释: 1. **线程与并发** - **线程*...
在Java并发编程中,多线程是核心概念之一。多线程允许程序同时执行多个任务,从而充分利用系统资源,提高程序性能。然而,多线程编程也带来了同步和竞态条件等问题,这需要开发者具备良好的线程管理和同步机制的知识...
Java多线程编程是Java开发中的...以上内容只是《Java多线程编程核心技术》教程中的一部分核心知识点,实际学习中还需要结合具体示例和实践来深入理解和掌握。通过学习,开发者可以编写出高效、稳定的多线程Java程序。
Java多线程编程是Java开发中的重要组成部分,它允许程序同时执行多个任务,极大地提高了程序的效率和响应性。在Java中,多线程主要通过`Thread`类和并发工具来实现,接下来我们将深入探讨这些关键知识点。 1. **...
### Java 并发核心编程知识点解析 #### 一、Java并发概述 自Java诞生之初,其设计者就赋予了该语言强大的并发处理能力。Java语言内置了对线程和锁的支持,这...理解和掌握这些概念和技术是成功进行并发编程的关键。
Java 多线程之并发锁 Java 中的多线程编程是指在一个程序中同时运行多个线程,以提高程序的执行效率和响应速度。在多线程编程中,线程间的同步是非常重要的,因为不同的线程可能会同时访问同一个共享资源,导致数据...
《Java并发编程实战》是Java并发编程领域的一本经典著作,它深入浅出地介绍了如何在Java平台上进行高效的多线程编程。这本书的源码提供了丰富的示例,可以帮助读者更好地理解书中的理论知识并将其应用到实际项目中。...