生产者消费者 java.util.concurrent.lock包
package com.mozq.thread.producer2; import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
/**
* 当使用等待时
* 如果用if会造成,线程被唤醒时不管条件是否满足,都会执行任务代码。产生错误。
* 改用while,每次线程被唤醒时会进行条件判断,是否满足。但是产生了死锁问题。
* 1.通过使用notifyAll而不是notify方法来解决死锁。
* 单生产者和单消费者不会因使用while发生死锁,因为,线程池中只有 一个另一方的线程,notify方法必然会唤醒另一方的线程。
* 多生产者和多消费者的等待集中有生产方和消费方的线程,notify方法可能会唤醒本方线程而不是另一方,造成 死锁。
*
* Condition对象可以为表示锁的一个等待集,一个锁可以产生多个Condition对象也就是等待集。并对它们分别进行操作。
* 针对多生产者和多消费者,我们可以分别为生产者和消费者创建一个等待集,并在唤醒时,调用另一方等待集的通知,确保唤醒的是另一方线程。避免了死锁。
*
* @author jie
*
*/
class Resource{
private String name = null;
private int count = 0;
private boolean set = false;
private Lock lock = new ReentrantLock();
private Condition producer = lock.newCondition();
private Condition consumer = lock.newCondition(); public void set(String name) {
lock.lock();
try {
//如果已经存在资源,等待
while(set) {
try {
producer.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//没有资源就创建
count++;
this.name = name + count;
System.out.println(Thread.currentThread().getName() + "生产。"+ this.name);
set = true;
//同时消费者消费
consumer.signal();
}finally {
lock.unlock();
}
} public void out() {
lock.lock();
try {
//如果没有产品,等待
while(!set) {
try {
consumer.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//有就消费
System.out.println(Thread.currentThread().getName() + "消费。。。。。"+ this.name);
set = false;
//通知生产者生产
producer.signal();
} finally {
lock.unlock();
}
}
} class Input implements Runnable{
private Resource r;
public Input(Resource r) {
this.r = r;
} @Override
public void run() {
while(true) {
r.set("烤鸡");
}
} }
class Output implements Runnable{
private Resource r;
public Output(Resource r) {
this.r = r;
} @Override
public void run() {
while(true) {
r.out();
}
} } public class ProducerConsumerDemo {
public static void main(String[] args) {
//创建资源
Resource r = new Resource();
//创建任务
Input in = new Input(r);
Output out = new Output(r);
//创建线程
Thread t0 = new Thread(in);
Thread t1 = new Thread(in);
Thread t2 = new Thread(out);
Thread t3 = new Thread(out);
//开启线程
t0.start();
t1.start();
t2.start();
t3.start();
}
}
生产者消费者 java.util.concurrent.lock包的更多相关文章
- Java:多线程,java.util.concurrent.atomic包之AtomicInteger/AtomicLong用法
1. 背景 java.util.concurrent.atomic这个包是非常实用,解决了我们以前自己写一个同步方法来实现类似于自增长字段的问题. 在Java语言中,增量操作符(++)不是原子的,也就 ...
- Java并发—java.util.concurrent.locks包
一.synchronized的缺陷 synchronized是java中的一个关键字,也就是说是Java语言内置的特性.那么为什么会出现Lock呢? 如果一个代码块被synchronized修饰了,当 ...
- JDK源码学习之 java.util.concurrent.automic包
一.概述 Java从JDK1.5开始提供了java.util.concurrent.atomic包,方便程序员在多线程环境下无锁的进行原子操作.原子变量的底层使用了处理器提供的原子指令,但是不同的CP ...
- Java并发—原子类,java.util.concurrent.atomic包(转载)
原子类 Java从JDK 1.5开始提供了java.util.concurrent.atomic包(以下简称Atomic包),这个包中 的原子操作类提供了一种用法简单.性能高效.线程安全地更新一个变量 ...
- java.util.concurrent.atomic 包详解
Atomic包的作用: 方便程序员在多线程环境下,无锁的进行原子操作 Atomic包核心: Atomic包里的类基本都是使用Unsafe实现的包装类,核心操作是CAS原子操作 关于CAS compar ...
- 《java.util.concurrent 包源码阅读》02 关于java.util.concurrent.atomic包
Aomic数据类型有四种类型:AomicBoolean, AomicInteger, AomicLong, 和AomicReferrence(针对Object的)以及它们的数组类型, 还有一个特殊的A ...
- java.util.concurrent包
在JavaSE5中,JUC(java.util.concurrent)包出现了 在java.util.concurrent包及其子包中,有了很多好玩的新东西: 1.执行器的概念和线程池的实现.Exec ...
- java.util.concurrent.atomic 类包详解
java.util.concurrent包分成了三个部分,分别是java.util.concurrent.java.util.concurrent.atomic和java.util.concurren ...
- 并发之java.util.concurrent.atomic原子操作类包
15.JDK1.8的Java.util.concurrent.atomic包小结 14.Java中Atomic包的原理和分析 13.java.util.concurrent.atomic原子操作类包 ...
随机推荐
- openstack之路:KVM/Libvirt 安装
openstac是一个开源的计算机平台,利用虚拟化和底层存储服务提供云计算服务.openstack的基本是虚拟化技术.虚拟化技术采用的KVM.我们首先进行KVM软件的安装. 电脑配置: 内存:8G 硬 ...
- ETF到底是什么?
ETF(交易所交易基金)是一种证券产品,它可以跟踪一些相关的资产,不论是股票.债券.商品,还是数字货币. ETF基金会负责跟踪指定的资产.然后放出部分股份,这些股份代表着对资产的拥有权. 交易ETF股 ...
- 20170314 OO ALV 出现双滚动条
1.出现双进度条,用户改变屏幕大小操作出现问题: 解决方法: [园童]BJ-ABAP-可乐(708925365) 16:08:55240 * 200改为240 200,然后将滚动条的步进改为1即可 ...
- MD5 字符串问题
早上来工位,大家再聊md5,无意中发现网上有个人提出个问题:研究了一下,挺有意思 有个串,通过各种办法得到的值不完全一样,下面请看细节: 假设这个字符串是 “ssss"我用的第一个办法应该是 ...
- Codeforces Round #364 (Div. 1)(vp) 没什么题解就留坑待填
我就做了前两题,第一题第一次vp就把我搞自闭跑路了,第二题第二次又把我搞自闭了 A. As Fast As Possible 细节题 #include<cstdio> #include&l ...
- UVA10518 How Many Calls? —— 矩阵快速幂
题目链接:https://vjudge.net/problem/UVA-10518 题解: 问:求斐波那契数f[n]的时候调用了多少次f[n] = f[n-1] + f[n-2],没有记忆化,一直递归 ...
- RBAC打造通用web管理权限
https://www.cnblogs.com/lamp01/p/6576432.html https://www.imooc.com/learn/799
- jsp报An error has occurred. See error log for more details. Argument not valid错误
An error has occurred. See error log for more details. Argument not valid 翻译过来是:一个错误已经发生.看到更多的细节错误日志 ...
- linux应用之yum命令详解
linux yum命令详解 yum(全称为 Yellow dog Updater, Modified)是一个在Fedora和RedHat以及SUSE中的Shell前端软件包管理器.基於RPM包管理,能 ...
- BZOJ_1095_[ZJOI2007]Hide 捉迷藏_动态点分治+堆
BZOJ_1095_[ZJOI2007]Hide 捉迷藏_动态点分治+堆 Description 捉迷藏 Jiajia和Wind是一对恩爱的夫妻,并且他们有很多孩子.某天,Jiajia.Wind和孩子 ...