原创 Java多线程开发六——锁、条件变量、信号量 收藏
1.锁和条件变量
JDK1.5以上提供了锁和条件变量来控制线程的同步,想必同步方法和等待/通知函数,锁和条件变量提供了更直观的使用形式,更广泛的锁定操作,更灵活的数据结构。此外,多个条件变量可以和一个锁绑定。
使用示例,代码来源于JDK文档,可以看一下基本的用法。
class BoundedBuffer {
final Lock lock = new ReentrantLock();
final Condition notFull = lock.newCondition();
final Condition notEmpty = lock.newCondition();
final Object[] items = new Object[100];
int putptr, takeptr, count;
public void put(Object x) throws InterruptedException {
lock.lock();
try {
while (count == items.length)
notFull.await();
items[putptr] = x;
if (++putptr == items.length) putptr = 0;
++count;
notEmpty.signal();
} finally {
lock.unlock();
}
}
public Object take() throws InterruptedException {
lock.lock();
try {
while (count == 0)
notEmpty.await();
Object x = items[takeptr];
if (++takeptr == items.length) takeptr = 0;
--count;
notFull.signal();
return x;
} finally {
lock.unlock();
}
}
}
锁代替了synchronized的使用,Condition代替了对象监控器方法(wait,notify)的使用。
2.信号量
信号量经常用来限制访问有限资源的线程数量。见一个例子(来源于JDK文档):
class Pool {
private static final MAX_AVAILABLE = 100;
private final Semaphore available = new Semaphore(MAX_AVAILABLE, true);
public Object getItem() throws InterruptedException {
available.acquire();//获取许可
return getNextAvailableItem();
}
public void putItem(Object x) {
if (markAsUnused(x))
available.release();//释放许可
}
// Not a particularly efficient data structure; just for demo
protected Object[] items = ... whatever kinds of items being managed
protected boolean[] used = new boolean[MAX_AVAILABLE];
protected synchronized Object getNextAvailableItem() {
for (int i = 0; i < MAX_AVAILABLE; ++i) {
if (!used[i]) {
used[i] = true;
return items[i];
}
}
return null; // not reached
}
protected synchronized boolean markAsUnused(Object item) {
for (int i = 0; i < MAX_AVAILABLE; ++i) {
if (item == items[i]) {
if (used[i]) {
used[i] = false;
return true;
} else
return false;
}
}
return false;
}
}
例子中最大支持100个线程并发访问,当前100个线程没有释放许可时,第101个线程就只能等待。
以上是简单的使用说明,如果需要了解更详细的信息,参考JDK文档。
附:一个用synchronized和wait、notify实现的信号量。
public class Semaphore {
private int count;
public Semaphore(int count){
this.count=count;
}
synchronized public void acquire() {//throws InterruptedException{
while (count==0){
try {
wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
count --;
}
synchronized public void release(){
count ++;
notify();
}
}
分享到:
相关推荐
这个名为"Java多线程的小例子——吃包子"的示例,旨在帮助开发者直观地理解多线程的工作原理。下面我们将深入探讨该示例所涉及的核心知识点。 首先,多线程通常涉及到以下几个关键概念: 1. **线程(Thread)**:...
3. 线程同步:Java提供了多种同步机制,如synchronized关键字、volatile变量、Lock接口(ReentrantLock等)、Semaphore信号量、CyclicBarrier屏障等,用于解决多线程环境下资源竞争和数据一致性问题。 二、不可变...
- Java多线程编程涉及多个方面的知识和技术,从基本的线程创建到高级的同步机制,都是开发高效、可靠的多线程应用程序所必需的。 - 正确理解和使用这些技术对于提高程序性能、避免死锁等问题至关重要。
在深入探讨Java多线程之前,我们先来了解一些基本的概念——进程与线程。 - **进程**:进程是程序的一次执行过程,是系统进行资源分配和调度的基本单位。每个进程拥有独立的地址空间和其他资源。进程之间相互独立,...
在Java编程中,多线程是处理并发执行的关键技术,它允许程序同时执行多个任务,提高了系统的效率和响应性。本资料主要探讨了Java中的并发模式和特性,涉及线程、锁以及原子操作等概念。 1. **线程**: - **创建...
在这个"Java多线程之龟兔赛跑"的例子中,我们看到了如何使用Java的Thread类来创建和管理线程,模拟经典的寓言故事——龟兔赛跑。 首先,我们创建了一个名为`WuguiThread`的类,它继承自`Thread`。这个类代表乌龟...
RedSpider社区的这个压缩包“多线程精品资源”显然是一个集合了社区成员原创和维护的关于Java多线程的系列文章,旨在帮助开发者深入理解和掌握多线程的核心概念及实践技巧。 1. **线程基础** - **线程的定义**:...
《JAVA线程(第三版)》是一本深入探讨Java多线程编程的权威书籍,针对Java线程的管理和优化提供了详尽的解析。线程在现代计算机编程中扮演着至关重要的角色,尤其是在并发处理和高性能应用中。Java以其强大的线程...
2. **线程同步**:包括互斥量(Mutex)、信号量(Semaphore)、条件变量(Condition Variable)等,用于控制线程的执行顺序,防止竞态条件。 3. **线程通信**:例如,使用Java的`BlockingQueue`进行线程间的数据传递...
生产者消费者问题是多线程设计模式的经典案例,涉及两个线程——生产者负责创建产品,而消费者负责消耗产品。Java中的BlockingQueue可以很好地解决这个问题,通过put()和take()方法,生产者可以将产品放入队列,消费...
线程间的同步可以通过锁(如synchronized关键字)、信号量、条件变量等机制实现。 **JVM中的共享变量与线程独占变量** - **共享变量**:实例字段、静态字段和数组元素存储在堆内存中,可以被所有线程访问,可能导致...
在本文中,我们将深入探讨多线程通信的重要性、常见方法以及如何解决经典的问题——读者写者问题。 首先,多线程通信(Inter-Thread Communication, ITC)是多线程编程中的关键部分,它涉及到线程间的同步和异步...
在本场景中,我们关注的是一个经典的多线程问题——"生产者-消费者"模式。这个模式是解决资源管理与同步问题的一个有效策略,它在操作系统、并发编程和分布式系统等领域广泛应用。 生产者-消费者模型涉及到两个主要...
为了防止生产者过快填满缓冲区或消费者过早清空缓冲区,需要引入同步机制,如信号量或者条件变量,来协调两者的行为。 在给定的压缩包文件中,"OSsubject.exe"可能是实现生产者-消费者问题的可执行程序,"OSsubject...
例如,一个线程可能负责生产数据,另一个线程负责消费数据,它们可能通过共享队列进行通信,或者使用信号量、条件变量等同步工具来协调彼此的操作。 为了更好地理解这个实例,我们需要查看具体的源代码来分析它们是...
5. **多线程**:包括线程的基本概念、创建方式(继承Thread类、实现Runnable接口、使用ExecutorService)、线程同步(synchronized、Lock、信号量等)以及并发工具类(CountDownLatch、CyclicBarrier、Semaphore等)...
除了基本的线程控制,Java并发库(java.util.concurrent)提供了更高级的工具,如`ReentrantLock`(可重入锁)、`Semaphore`(信号量)等,用于更灵活的线程管理和资源控制。虽然这些工具在这个简单的存款取款示例中...
为防止这种情况,我们需要使用锁或其他同步机制,如互斥量、信号量或条件变量,确保同一时刻只有一个线程能修改共享资源。 2. **死锁**:两个或更多线程相互等待对方释放资源,导致所有线程都无法继续执行。通过...
- **Java并发工具类**:如Semaphore(信号量)、CyclicBarrier(回环栅栏)、CountDownLatch(计数器)等用于协调线程间的操作。 3. **线程池** - **ExecutorService**:Java提供的线程池接口,通过...
Java多线程源码分析——以SmartSocket为例 在Java编程中,多线程技术是构建高效、可扩展的应用程序的关键。SmartSocket是一款基于Java和PHP的开源套接字服务器引擎,它允许开发者轻松地创建支持多用户的网络应用...