`
softstone
  • 浏览: 480619 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

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代替了对象监控器方法(waitnotify)的使用。
 
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文档。
 
附:一个用synchronizedwaitnotify实现的信号量。
 
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多线程的小例子——吃包子

    这个名为"Java多线程的小例子——吃包子"的示例,旨在帮助开发者直观地理解多线程的工作原理。下面我们将深入探讨该示例所涉及的核心知识点。 首先,多线程通常涉及到以下几个关键概念: 1. **线程(Thread)**:...

    java多线程设计

    3. 线程同步:Java提供了多种同步机制,如synchronized关键字、volatile变量、Lock接口(ReentrantLock等)、Semaphore信号量、CyclicBarrier屏障等,用于解决多线程环境下资源竞争和数据一致性问题。 二、不可变...

    Java多线程运算集合

    - Java多线程编程涉及多个方面的知识和技术,从基本的线程创建到高级的同步机制,都是开发高效、可靠的多线程应用程序所必需的。 - 正确理解和使用这些技术对于提高程序性能、避免死锁等问题至关重要。

    Java多线程之龟兔赛跑

    在这个"Java多线程之龟兔赛跑"的例子中,我们看到了如何使用Java的Thread类来创建和管理线程,模拟经典的寓言故事——龟兔赛跑。 首先,我们创建了一个名为`WuguiThread`的类,它继承自`Thread`。这个类代表乌龟...

    Java多线程入门介绍.pdf

    在深入探讨Java多线程之前,我们先来了解一些基本的概念——进程与线程。 - **进程**:进程是程序的一次执行过程,是系统进行资源分配和调度的基本单位。每个进程拥有独立的地址空间和其他资源。进程之间相互独立,...

    通过多线程编程在Java中发现的并发模式和特性——线程、锁、原子等.zip

    在Java编程中,多线程是处理并发执行的关键技术,它允许程序同时执行多个任务,提高了系统的效率和响应性。本资料主要探讨了Java中的并发模式和特性,涉及线程、锁以及原子操作等概念。 1. **线程**: - **创建...

    多线程精品资源--这是RedSpider社区成员原创与维护的Java多线程系列文章。.zip

    RedSpider社区的这个压缩包“多线程精品资源”显然是一个集合了社区成员原创和维护的关于Java多线程的系列文章,旨在帮助开发者深入理解和掌握多线程的核心概念及实践技巧。 1. **线程基础** - **线程的定义**:...

    JAVA线程(第三版)

    《JAVA线程(第三版)》是一本深入探讨Java多线程编程的权威书籍,针对Java线程的管理和优化提供了详尽的解析。线程在现代计算机编程中扮演着至关重要的角色,尤其是在并发处理和高性能应用中。Java以其强大的线程...

    多线程编程之一 介绍+例程

    2. **线程同步**:包括互斥量(Mutex)、信号量(Semaphore)、条件变量(Condition Variable)等,用于控制线程的执行顺序,防止竞态条件。 3. **线程通信**:例如,使用Java的`BlockingQueue`进行线程间的数据传递...

    思维导图-多线程进阶总结02

    生产者消费者问题是多线程设计模式的经典案例,涉及两个线程——生产者负责创建产品,而消费者负责消耗产品。Java中的BlockingQueue可以很好地解决这个问题,通过put()和take()方法,生产者可以将产品放入队列,消费...

    Java并发理论,如何理解线程安全.docx

    线程间的同步可以通过锁(如synchronized关键字)、信号量、条件变量等机制实现。 **JVM中的共享变量与线程独占变量** - **共享变量**:实例字段、静态字段和数组元素存储在堆内存中,可以被所有线程访问,可能导致...

    操作系统中多线程之间通信

    在本文中,我们将深入探讨多线程通信的重要性、常见方法以及如何解决经典的问题——读者写者问题。 首先,多线程通信(Inter-Thread Communication, ITC)是多线程编程中的关键部分,它涉及到线程间的同步和异步...

    【Java面试题汇总】——超全,建议多次学习,经常复习,常看常新!.rar

    5. **多线程**:包括线程的基本概念、创建方式(继承Thread类、实现Runnable接口、使用ExecutorService)、线程同步(synchronized、Lock、信号量等)以及并发工具类(CountDownLatch、CyclicBarrier、Semaphore等)...

    生产者-消费者多线程处理

    在本场景中,我们关注的是一个经典的多线程问题——"生产者-消费者"模式。这个模式是解决资源管理与同步问题的一个有效策略,它在操作系统、并发编程和分布式系统等领域广泛应用。 生产者-消费者模型涉及到两个主要...

    java通信实例

    例如,一个线程可能负责生产数据,另一个线程负责消费数据,它们可能通过共享队列进行通信,或者使用信号量、条件变量等同步工具来协调彼此的操作。 为了更好地理解这个实例,我们需要查看具体的源代码来分析它们是...

    多线程模拟

    为了防止生产者过快填满缓冲区或消费者过早清空缓冲区,需要引入同步机制,如信号量或者条件变量,来协调两者的行为。 在给定的压缩包文件中,"OSsubject.exe"可能是实现生产者-消费者问题的可执行程序,"OSsubject...

    简单银行存款取款,以及实现线程java源代码

    除了基本的线程控制,Java并发库(java.util.concurrent)提供了更高级的工具,如`ReentrantLock`(可重入锁)、`Semaphore`(信号量)等,用于更灵活的线程管理和资源控制。虽然这些工具在这个简单的存款取款示例中...

    简单多线程

    为防止这种情况,我们需要使用锁或其他同步机制,如互斥量、信号量或条件变量,确保同一时刻只有一个线程能修改共享资源。 2. **死锁**:两个或更多线程相互等待对方释放资源,导致所有线程都无法继续执行。通过...

    MCA 多线程&高并发.zip

    - **Java并发工具类**:如Semaphore(信号量)、CyclicBarrier(回环栅栏)、CountDownLatch(计数器)等用于协调线程间的操作。 3. **线程池** - **ExecutorService**:Java提供的线程池接口,通过...

    java多线程源码-SmartSocket:SmartSocket是可扩展的开源Java和PHP套接字服务器引擎。其目的是使创建多用户应用程序

    Java多线程源码分析——以SmartSocket为例 在Java编程中,多线程技术是构建高效、可扩展的应用程序的关键。SmartSocket是一款基于Java和PHP的开源套接字服务器引擎,它允许开发者轻松地创建支持多用户的网络应用...

Global site tag (gtag.js) - Google Analytics