java线程通讯——使用Lock和Condition代替synchronized 和 wait, notify notifyAll()

Lock 实现提供了比使用 synchronized 方法和语句可获得的更广泛的锁定操作。

此实现允许更灵活的结构,可以具有差别很大的属性,可以支持多个相关的 Condition 对象。

使用生产者和消费者为例!!!

import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/**

 * 使用Lock和Condition代替
 * synchronized 和 wait, notify notifyAll();

 */
class Resource2{
	private String product;
	private int count = 1;
	private boolean flag= false;

	private Lock lock = new ReentrantLock();

	Condition condition_pro = lock.newCondition(); //鎖創建的生產者condition對象!!
	Condition condition_con = lock.newCondition(); //鎖創建的消費者condition對象!!

	public void produce(String product) throws InterruptedException{
		lock.lock();
		try {
		while(flag){

				condition_pro.await();
		}

			this.product = product+"----"+ count++;
			System.out.println(Thread.currentThread().getName()+"————生產了————"+this.product);
			flag= true;
			condition_con.signal();  //喚醒消費者對象!!!
		}finally{
			lock.unlock();
		}
	}

	public  void consume() throws InterruptedException{

		lock.lock();
		try {
		while(!flag){

				condition_con.await();
		}

			System.out.println(Thread.currentThread().getName()+"————消費了————"+this.product);
			flag= false;
			condition_pro.signal(); //喚起生產者對象!!!
		}finally{
			lock.unlock();
		}
	}

}

class Producer2 implements Runnable{
	private Resource2 res;

	public Producer2(Resource2 res){
		this.res= res;
	}
	@Override
	public void run() {
		while(true){
		try {
			res.produce("Iphone 7");
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		}
	}

}
class Consumer2 implements Runnable{
	private Resource2 res;

	public Consumer2(Resource2 res){
		this.res= res;
	}
	@Override
	public void run() {
		while(true){
		try {
			res.consume();
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		}
	}

}

public class ProducerComsumer2 {

	public static void main(String[] args) {

		Resource2 res = new Resource2();

		Producer2 pro = new Producer2(res);
		Consumer2 con = new Consumer2(res);

		Thread t1 = new Thread(pro,"生產者1");
		Thread t2 = new Thread(pro,"生產者2");
		Thread t3 = new Thread(con,"消費者1");
		Thread t4 = new Thread(con,"消費者2");

		t1.start();
		t2.start();
		t3.start();
		t4.start();
		//new Thread(new Producer(res)).start();
		//new Thread(new Consumer(res)).start();

	}

}
时间: 2024-11-05 14:54:12

java线程通讯——使用Lock和Condition代替synchronized 和 wait, notify notifyAll()的相关文章

Java线程新特性--- Lock

在Java5中,专门提供了锁对象,利用锁可以方便的实现资源的封锁,用来控制对竞争资源并发访问的控制,这些内容主要集中在java.util.concurrent.locks包下面,里面有三个重要的接口Condition.Lock.ReadWriteLock. Condition Condition将Object监视器方法(wait.notify和 notifyAll)分解成截然不同的对象,以便通过将这些对象与任意Lock实现组合使用,为每个对象提供多个等待set(wait-set). Lock L

关于java线程浅谈五: Condition条件

在面试的过程当中,在面试官提出问题的时候,往往会就问题本身引申出较深层次的问题.比如:你使用过with语句吗?我的回答是:with语句经常适用于对资源进行访问的场合,确保在访问的过程中不管是否发生异常都会指执行必要的清理操作,比如文件的自动关闭以及线程中锁的自动获取与释放.面试官紧接着问,那你知道为什么with语句能够使文件正确关闭,一下子把我问闷了,只能依稀记得with语句会开辟出一块独立环境来执行文件的访问,类似沙盒机制.面试官对这个答案不置可否,算是勉强通过了.所以知其然更要知其所以然.在

Java 线程基础

目录 Java 线程基础  一.线程简介  二.线程基本用法  三.线程间通信  四.线程状态  参考资料 Java 线程基础 ?? 本文以及示例源码已归档在 javacore 一.线程简介 什么是进程 什么是线程 进程和线程的区别 二.线程基本用法 创建线程 线程休眠 线程礼让 终止线程 守护线程 FAQ 三.线程间通信 wait/notify/notifyAll join 管道 四.线程状态 参考资料 一.线程简介 什么是进程 简言之,进程可视为一个正在运行的程序.它是系统运行程序的基本单位

Java线程并发控制基础知识

微博上众神推荐今年4月刚刚出版的一本书,淘宝华黎撰写的<大型网站系统与Java中间件实践>,一线工程师的作品,实践出真知,果断要看. 前两章与<淘宝技术这十年>内容类似,基本是讲从一个小网站如何慢慢升级成分布式网站,从第三章开始亮出干货,个人感觉总结的很好,本文主要摘取并扩充下作者第三章的内容 作学习交流之用,非盈利性质 线程池.线程同步.互斥锁.读写锁.原子数.唤醒.通知.信号量.线程交换队列 线程池 推荐用ThreadPoolExecutor的工厂构造类Executors来管理

使用ReentrantLock和Condition来代替内置锁和wait(),notify(),notifyAll()

使用ReentrantLock可以替代内置锁,当使用内置锁的时候,我们可以使用wait() nitify()和notifyAll()来控制线程之间的协作,那么,当我们使用ReentrantLock的时候,我们怎么来处理线程之间的写作呢? JDK5.0为我们提供了Condition对象来替代内置锁的 wait(),notify()和notifyAll()方法 内置锁的话,就只能有一个等待队列,所有的在某个对象上执行wait()方法的线程都会被加入到该对象的等待队列中去(线程会被挂起),需要其他的线

线程高级应用-心得5-java5线程并发库中Lock和Condition实现线程同步通讯

1.Lock相关知识介绍 好比我同时种了几块地的麦子,然后就等待收割.收割时,则是哪块先熟了,先收割哪块. 下面举一个面试题的例子来引出Lock缓存读写锁的案例,一个load()和get()方法返回值为空时的情况:load()的返回值是一个代理对象,而get()却是一个实实在在的对象:所以当返回对象为空是,get()返回null,load()返回一个异常对象:具体分析如下: 一个读写锁的缓存库案例:用上面那道面试题分析则很好理解: 线程阻塞问题:运用多个Condition对象解决 2. Lock

【Java线程】锁机制:synchronized、Lock、Condition

http://www.infoq.com/cn/articles/java-memory-model-5  深入理解Java内存模型(五)——锁 http://www.ibm.com/developerworks/cn/java/j-jtp10264/  Java 理论与实践: JDK 5.0 中更灵活.更具可伸缩性的锁定机制 http://blog.csdn.net/ghsau/article/details/7481142 1.synchronized 把代码块声明为 synchronize

JAVA 并发编程-线程同步通信技术(Lock和Condition)(十)

在之前的博客中已经介绍过线程同步通信技术<JAVA 并发编程-传统线程同步通信技术(四)>,上篇是使用的synchronized,wait,notify来实现,今天我们使用的是Lock和Condition,下面我们结合两者对比来学习. 简单的Lock锁应用: /** * 简单Lock的应用 * @author hejingyuan * */ public class LockTest { public static void main(String[] args) { new LockTest

java线程 使用显示的lock 和condition

package org.rui.thread.block2; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.