java多线程---等待/唤醒以及生产者消费者经典同步Lock的实现
来源:互联网 发布:软件可靠性英文 编辑:程序博客网 时间:2024/06/04 19:27
在jdk1.5并发包中引入的Lock,其主要实现重入锁,和读写锁,并且相对于synchronized原生的将锁的获取和释放显示化,并且可以提供了非阻塞的获取锁,并结合condition实现多路分之,将条件更加细化,并且比synchronized效率更高,但是在jdk1.6,对synchronized做出了很多优化,所以性能不一定比lock差,下面给出使用lock来实现等待/唤醒和之前的生产者消费者同步问题的代码:
package com.zcj.thread03;import java.util.concurrent.locks.Condition;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;public class LockTest { private Lock lock = new ReentrantLock(); private Condition condition = lock.newCondition(); public void waitTest(){ lock.lock(); try{ System.out.println("我开始等待,等待被唤醒!"); condition.await(); System.out.println("我已经被唤醒!"); }catch(InterruptedException e){ e.printStackTrace(); }finally{ lock.unlock(); } } public void signalTest(){ lock.lock(); System.out.println("我唤醒等待线程"); condition.signal(); lock.unlock(); } public static void main(String[] args) {LockTest lockTest = new LockTest();ThreadA threadA = new ThreadA(lockTest);ThreadB threadB = new ThreadB(lockTest);threadA.start();try {Thread.sleep(3000);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}threadB.start();}}class ThreadA extends Thread{private LockTest lockTest;public ThreadA(LockTest lockTest){this.lockTest = lockTest;}@Overridepublic void run(){lockTest.waitTest();}}class ThreadB extends Thread{private LockTest lockTest;public ThreadB(LockTest lockTest){this.lockTest = lockTest;}@Overridepublic void run(){lockTest.signalTest();}}单个消费者和单个生产者的同步代码如下:
package com.zcj.thread03;import java.util.concurrent.locks.Condition;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;public class LockTest {private int count=1; private Lock lock = new ReentrantLock(); private Condition condition = lock.newCondition(); private Condition condition2 = lock.newCondition(); public void produce(){ lock.lock(); try{ if(count==1){ condition.await(); } count=1; System.out.println("生产者生产商品!"); condition2.signal(); }catch(InterruptedException e){ e.printStackTrace(); }finally{ lock.unlock(); } } public void consume(){ lock.lock(); try{ if(count==0){ condition2.await(); } count=0; System.out.println("消费者消费商品!"); condition.signal(); }catch(InterruptedException e){ e.printStackTrace(); }finally{ lock.unlock(); } } public static void main(String[] args) {LockTest lockTest = new LockTest();ThreadA threadA = new ThreadA(lockTest);ThreadB threadB = new ThreadB(lockTest);threadA.start();threadB.start();}}class ThreadA extends Thread{private LockTest lockTest;public ThreadA(LockTest lockTest){this.lockTest = lockTest;}@Overridepublic void run(){while(true){lockTest.produce();}}}class ThreadB extends Thread{private LockTest lockTest;public ThreadB(LockTest lockTest){this.lockTest = lockTest;}@Overridepublic void run(){while(true){lockTest.consume();}}}从代码中可以看出使用lock我们可以指定唤醒什么条件下的线程
接下来编写多个消费者和多个生产者,只需要把if改为while和signal改为signalAll即可,代码如下:
package com.zcj.thread03;import java.util.concurrent.locks.Condition;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;public class LockTest {private int count=1; private Lock lock = new ReentrantLock(); private Condition condition = lock.newCondition(); private Condition condition2 = lock.newCondition(); public void produce(){ lock.lock(); try{ while(count==1){ condition.await(); } count=1; System.out.println(Thread.currentThread().getName()+"生产者生产商品!"); condition2.signalAll(); }catch(InterruptedException e){ e.printStackTrace(); }finally{ lock.unlock(); } } public void consume(){ lock.lock(); try{ while(count==0){ condition2.await(); } count=0; System.out.println(Thread.currentThread().getName()+"消费者消费商品!"); condition.signalAll(); }catch(InterruptedException e){ e.printStackTrace(); }finally{ lock.unlock(); } } public static void main(String[] args) {LockTest lockTest = new LockTest();ThreadA threadA = new ThreadA(lockTest);ThreadA threadA1 = new ThreadA(lockTest);ThreadB threadB = new ThreadB(lockTest);ThreadB threadB1 = new ThreadB(lockTest);threadA.start();threadA1.start();threadB.start();threadB1.start();}}class ThreadA extends Thread{private LockTest lockTest;public ThreadA(LockTest lockTest){this.lockTest = lockTest;}@Overridepublic void run(){while(true){lockTest.produce();}}}class ThreadB extends Thread{private LockTest lockTest;public ThreadB(LockTest lockTest){this.lockTest = lockTest;}@Overridepublic void run(){while(true){lockTest.consume();}}}
0 0
- java多线程---等待/唤醒以及生产者消费者经典同步Lock的实现
- java多线程---等待/唤醒以及生产者消费者经典同步synchronized的实现
- 多线程-等待唤醒机制经典案例-生产者消费者
- 多线程_生产者消费者之等待唤醒机制代码实现
- Java多线程-Lock锁的使用,以及生产者和消费者的实现
- 多线程-生产者消费者之等待唤醒机制
- Java多线程生产者消费者说明等待唤醒机制问题和虚假唤醒问题
- java多线程实现生产者/消费者同步
- 多线程——等待唤醒机制经典实例:生产者消费者模式
- 多线程——等待唤醒机制经典实例:生产者消费者模式(优化)
- 多线程经典问题之生产者消费者问题的JAVA实现
- java多线程经典的生产者消费者问题
- 多线程_生产者消费者之等待唤醒机制思路图解
- 多线程_生产者消费者之等待唤醒机制代码分析
- 多线程_生产者消费者之等待唤醒机制代码优化
- 多线程-生产者消费者之等待唤醒机制代码优化
- java多线程中的等待唤醒机制--多生产者多消费者问题
- java多线程之 生产者和消费者 线程间通信 等待与唤醒机制
- localStorage的跨域问题解决方案
- android studio 2.2 C++ 支持(CMAKE方法)
- Kafka+Spark Streaming+Redis实时计算整合实践
- 字典序问题
- 在PPT中播放插入flash的指定片段
- java多线程---等待/唤醒以及生产者消费者经典同步Lock的实现
- eclipse Maven配置
- linux基本命令(47)——iostat命令
- Flask Web 开发学习稿(二)
- 给图片设置填充父控件,但是图片显示出来宽高还是有空白
- Android获得小图
- 【JZOJ 3427】归途与征程
- JavaBean详解
- 下载chrome浏览器的地址