`

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多线程之ReentrantLock与Condition - 平凡希 - 博客园1

    1、ReentrantLock简介 2、ReentrantLock函数列表 3、重入的实现 4、公平锁与非公平锁 5、ReentrantLock 扩展的功能 6

    Java多线程中ReentrantLock与Condition详解

    主要介绍了Java多线程中ReentrantLock与Condition详解,需要的朋友可以参考下

    Java并发之ReentrantLock类源码解析

    主要为大家详细介绍了Java并发系列之ReentrantLock源码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

    java ReentrantLock详解.docx

    java除了使用关键字synchronized外,还可以使用ReentrantLock实现独占锁的功能。而且ReentrantLock相比synchronized而言功能更加丰富,使用起来更为灵活,也更适合复杂的并发场景。这篇文章主要是从使用的角度来分析...

    ReentrantLock与synchronized区别

    java语言 并发编程 ReentrantLock与synchronized区别 详解

    Java多线程ReentrantLock1

    Java多线程ReentrantLock1

    深入java并发编程,使用ReentrantLock和 Synchronized加锁

    深入java并发编程,使用ReentrantLock和 Synchronized加锁

    CyclicBarrier,reentrantlock,condition模拟抢票

    用CyclicBarrier,reentrantlock,condition来完成同时购买,同步购买的功能 JUC系列之模拟抢票(N人同时抢票,票不足系统补仓,N-M人继续抢票) http://blog.csdn.net/crazyzxljing0621/article/details/77891620

    Java并发编程基础.pdf

    线程同步与通信:掌握Java中的同步机制,如synchronized关键字、wait()和notify()方法,以及更高级的并发工具如ReentrantLock、Condition等。了解线程间的通信方式,如共享内存、消息传递等。 并发集合:熟悉Java...

    Java中的ReentrantLock类最全讲义

    目录: 简介 ReentrantLock的基本用法 2.1 创建ReentrantLock ...条件变量与Condition 5.1 创建Condition 5.2 await()和signal() 可重入性 ReentrantLock与synchronized的对比 最佳实践与注意事项

    【Java并发】当年因为Reentrantlock被拒,今天把它源码里里外外给扒了

    【Java并发】当年因为Reentrantlock被拒,今天把它源码里里外外给扒了

    locks框架_ReentrantLock.pdf

    这份资源旨在详细讲解 Java 中的 Locks 框架,特别关注 ReentrantLock 的使用和原理。Locks 框架提供了比传统的 synchronized 关键字更强大、更灵活的线程同步机制,而 ReentrantLock 是其中的一种重要实现。 Locks ...

    Java并发编程学习笔记

    4、ReentrantLock底层实现和如何使用 5、Condition源码分析 6、ReentrantReadWriteLock底层实现原理 7、并发工具类CountDownLatch 、CyclicBarrier和Semaphore底层实现原理 8、线程池原理和如何使用线程池 9、...

    Java并发系列之ReentrantLock源码分析

    主要为大家详细介绍了Java并发系列之ReentrantLock源码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

    java并发编程面试题

    java并发编程 基础知识,守护线程与线程, 并行和并发有什么区别? 什么是上下文切换? 线程和进程区别 什么是线程和进程? 创建线程有哪几种方式?,如何避免线程死锁 线程的 run()和 start()有什么区别? 什么是 ...

    java高并发相关知识点.docx

    性能优化:Java中的性能优化,包括JVM参数调优、代码优化、使用并发框架等。 并行计算:Java中的并行计算,包括Fork/Join框架、并行流等。 线程间通信:Java中的线程间通信,包括wait()、notify()、notifyAll()等...

    Java并发编程实战

    Java并发编程实战 本书深入浅出地介绍了Java线程和并发,是一本完美的Java并发参考手册。书中从并发性和线程安全性的基本概念出发,介绍了如何使用类库提供的基本并发构建块,用于避免并发危险、构造线程安全的类及...

    Java多线程 ReentrantLock互斥锁详解

    主要介绍了Java多线程 ReentrantLock互斥锁详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    Java并发编程之显示锁ReentrantLock和ReadWriteLock读写锁

    主要介绍了Java并发编程之显示锁ReentrantLock和ReadWriteLock读写锁,本文讲解了ReentrantLock概况、Lock接口、Lock使用、轮询锁的和定时锁、公平性、可中断获锁获取操作等内容,需要的朋友可以参考下

    Java中ReentrantLock的使用.docx

    在JAVA中ReentrantLock 和synchronized 都是可重入锁; 重入锁ReentrantLock 相对来说是synchronized、Object.wait()和Object.notify()方法的替代品(或者说是增强版),在JDK5.0的早期版本,重入锁的性能远远好于...

Global site tag (gtag.js) - Google Analytics