`

JAVA并发框架ReentrantLock与Condition

阅读更多
同步代码与同步代码块可以实现多线程的同步,JAVA并发框架提供另外了一个框架,它也能实现多线程的同步,即是Lock和Condition,Condition和Lock是配合在一起使用,从字面意思上看,Condition是条件锁,有了锁,为什么要引用条件锁呢?原因有两个:
1.对一个共享资源有读和写的能力,如果读线程或写线程获取了Lock的权力,即有能力进入,但是如果里面没有内容,读也没有用,如果空间已满了,写也写不了,所有还得有条件去判断一下,是不是线程要等待了;
2.提供一种多线程之间的通信机制,类似wait()和nofity()的原理。

看一个例子,就会明白了,还是实现上次的那个生产者和消费者的例子。
我们假设有一个篮子,最多可以放3个苹果,有多个人可以放苹果,也有多个人可以拿走苹果。

public class Apple {
        private String appName ;
        public  Apple(String appName ){
               this.appName =appName ;
       }
       
        public String ToString(){
               return this .appName ;
       }
}

public class Bascket {
       List<Apple> bascket= new ArrayList<Apple>(10);
       
       Lock lock = new ReentrantLock();
        //条件锁与Lock是相关的
       Condition noEmptity =lock .newCondition();
       Condition isFull = lock.newCondition();
       
        public void put(Apple app) throws InterruptedException{
               //获取锁
               lock.lock();
               try{
                 if(bascket .size()>=10){
                        //等待
                        isFull.await();
                 }
                 bascket.add( app);
                 //唤醒其它等待线程
                 noEmptity.signalAll();
              }
               finally{
                      lock.unlock();
              }
       }
       
        public Apple take() throws InterruptedException{
               lock.lock();
              Apple apple;
               try{
                      if(bascket .size()<=0){
                            noEmptity.await();
                     }
                      apple= bascket.remove(0);
                      isFull.signalAll();
              }
               finally{
                      lock.unlock();
              }
               return apple ;
       }

}

//生产者
public class Producer implements Runnable{
        private Bascket bascket ;
        private String name ;
        public Producer(Bascket bascket ,String name ){
               this.bascket =bascket ;
               this.name =name ;
       }
        public void run(){
              
               while(true ){
                      try {
                           System. out.println( name+ "produce..");
                            bascket.put( new Apple("name"+(int )Math.random()*1000));
                     } catch (InterruptedException e ) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                     }
                      try {
                           Thread. sleep(1000);
                     } catch (InterruptedException e ) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                     }
                     
              }
              
       }

}

public class TestDemo {
        public static void main(String args[]){
              Bascket bascket= new Bascket();
              Consumer c1= new Consumer(bascket ,"c1" );
              
              Producer p1= new Producer(bascket ,"p1" );
              Producer p2= new Producer(bascket ,"p2" );
              
               //线程池管理
              ExecutorService service = Executors. newCachedThreadPool();
               service.execute( c1);
               service.execute( p1);
               service.execute( p2);
       }
}

具体Lock的实现机制将会在源代码中加以分析。

分享到:
评论

相关推荐

    Java 并发核心编程

    #### 一、Java并发概述 自Java诞生之初,其设计者就赋予了该语言强大的并发处理能力。Java语言内置了对线程和锁的支持,这使得开发者能够轻松地编写多线程应用程序。本文旨在帮助Java开发者深入理解并发的核心概念...

    java并发实战中文文档

    3. **锁**:Java并发库中的`java.util.concurrent.locks`包提供了更高级的锁机制,如可重入锁(`ReentrantLock`)、读写锁(`ReadWriteLock`)和条件变量(`Condition`),这些工具允许更灵活的控制并发访问。 4. **并发...

    Java并发编程全景图.pdf

    Java并发编程是Java语言中最为复杂且重要的部分之一,它涉及了多线程编程、内存模型、同步机制等多个领域。为了深入理解Java并发编程,有必要了解其核心技术点和相关实现原理,以下将详细介绍文件中提及的关键知识点...

    一本经典的多线程书籍 Java并发编程 设计原则与模式 第二版 (英文原版)

    《Java并发编程 设计原则与模式 第二版》是一本深受程序员喜爱的经典书籍,由Addison Wesley出版。这本书深入探讨了Java平台上的多线程编程技术,为开发者提供了丰富的设计原则和模式,帮助他们理解和解决并发环境中...

    java并发编程实战.zip

    4. **锁与并发工具类**:介绍了Java.util.concurrent包中的锁机制,如ReentrantLock、读写锁(ReentrantReadWriteLock)、Condition接口,以及Semaphore、CountDownLatch、CyclicBarrier等并发工具类的使用场景和...

    《Java 并发编程实战》.zip

    最后,书中将介绍一些高级话题,如原子类(Atomic Variables)、并发工具类(如CountDownLatch、CyclicBarrier、Semaphore等),以及Java并发框架如Fork/Join框架和CompletableFuture,这些高级特性能够帮助开发者...

    [Java并发编程实践].(Java.Concurrency.in.Practice).Brian.Goetz.文字版(1)

    6. **线程池**:Executor框架是Java并发编程的重要组成部分,它通过线程池管理线程,提高了系统资源的利用率,减少了线程创建和销毁的开销。 7. **并发异常处理**:书中强调了在并发环境中正确处理异常的重要性,...

    Java 并发编程实战-随书源码

    《Java并发编程实战》这本书是Java开发者深入理解并发编程的重要参考书籍。本书旨在帮助程序员解决在多线程环境中遇到的实际问题,提升系统性能并保证其稳定性。随书源码提供了丰富的示例,让读者能够动手实践,加深...

    Java高并发经典文档-PDF-可在电子书里查看

    《实战Java高并发程序设计》是一本专注于Java并发编程的经典文献,它深入浅出地讲解了如何在Java环境中处理高并发场景。这本书是PDF格式,包含详细的目录,方便读者快速定位到所需的知识点,是Java开发者提升并发...

    Java并发编程艺术

    6. **线程池**:Executor框架是Java并发编程的重要组成部分,通过ThreadPoolExecutor可以创建线程池,有效管理和控制并发线程的数量,避免过度创建和销毁线程带来的性能开销。 7. **死锁、活锁与饥饿**:并发编程中...

    Java并发编程实践.rar

    介绍Java并发编程中常用的集合框架,如ConcurrentHashMap、CopyOnWriteArrayList等,它们是如何在多线程环境下保证数据一致性与高效性的。 第五章:线程池 分析ExecutorService和ThreadPoolExecutor,解释如何配置...

    实战Java高并发程序设计第二版随书代码

    - **JDK 7及更高版本的新特性**:例如Fork/Join框架、Parallel Streams等,这些都是Java并发编程的最新进展。 随书附带的`concurrentbook`和`concurrentbook-jdk7`文件夹可能包含了与上述知识点对应的示例代码,...

    Java 并发编程实战

    - **Lock接口**:介绍ReentrantLock、Condition、读写锁等高级同步工具,及其与synchronized的区别。 3. **并发集合** - **线程安全的集合**:如Vector、Collections.synchronizedXXX方法生成的同步集合,以及...

    java并发工具类

    `Executor`框架是Java并发编程的核心,它提供了线程池的创建与管理。通过`ExecutorService`接口,我们可以提交任务(Runnable或Callable)并控制线程的执行。线程池可以有效控制运行的线程数量,避免了大量的线程...

    Java 多线程与并发-Java并发知识体系详解.pdf

    Java并发工具包J.U.C(Java Util Concurrency)包含了丰富的一系列并发组件,如Lock框架(ReentrantLock等)、并发集合(ConcurrentHashMap等)、原子类(AtomicInteger等)、线程池(ExecutorService)和工具类。...

    java并发编程实践中文版

    5. **线程池**:Executor框架是Java并发编程的核心部分,它引入了线程池的概念,可以有效地管理和控制线程的生命周期,避免频繁创建和销毁线程的开销。ThreadPoolExecutor是线程池的主要实现,通过调整核心线程数、...

    实战java高并发程序设计源码下载

    这个"实战java高并发程序设计"的源码下载提供了深入理解和实践Java并发编程的机会。下面,我们将深入探讨Java并发相关的知识体系。 一、并发基础 并发是指多个任务在同一时间间隔内执行,而并行则意味着这些任务是...

    locks框架_ReentrantLock.pdf

    总之,通过深入学习Locks框架,尤其是ReentrantLock,开发者可以更好地理解和掌握Java多线程中的同步控制,提升并发程序的效率和安全性。了解ReentrantLock的工作原理、用法及其与`synchronized`的区别,将有助于...

    java高并发系统设计

    - **同步机制**:Java提供`synchronized`关键字、`Lock`接口(如`ReentrantLock`)来确保线程安全,防止数据竞争。 2. **并发控制** - **锁机制**:包括互斥锁、读写锁、自旋锁等,用于控制对共享资源的访问。 -...

    阿里Java并发程序设计教程

    标题《阿里Java并发程序设计教程》揭示了这是一份面向Java开发者的教程,专注于介绍Java中的并发编程技术。该教程将Java并发编程的核心概念进行了系统性的讲解,涵盖了从基础到高级的多个方面。而描述部分列举了教程...

Global site tag (gtag.js) - Google Analytics