Lock是顶层接口,它的实现逻辑并未用到synchronized,而是利用了volatile的可见性.ReentrantLock对了Lock接口的实现主要依赖了Sync,而Sync继承了 AbstractQueuedSynchronizer(AQS) ReentrantLock: public class ReentrantLock implements Lock, java.io.Serializable { private static final long serialVersionUID…
摘要: Java实现生产者消费者问题与读者写者问题 1.生产者消费者问题 生产者消费者问题是研究多线程程序时绕不开的经典问题之一,它描述是有一块缓冲区作为仓库,生产者可以将产品放入仓库,消费者则可以从仓库中取走产品.解决生产者/消费者问题的方法可分为两类:(1)采用某种机制保护生产者和消费者之间的同步:(2)在生产者和消费者之间建立一个管道.第一种方式有较高的效率,并且易于实现,代码的可控制性较好,属于常用的模式.第二种管道缓冲区不易控制,被传输数据对象不易于封装等,实用性不强. 同步问题核心在…
1.阻塞队列:http://www.cnblogs.com/dolphin0520/p/3932906.html 2.Condition 生产者消费者实现 :http://www.cnblogs.com/dolphin0520/p/3920385.html 3. Condition 优点 :http://blog.csdn.net/ghsau/article/details/7481142 3.Lock :http://www.cnblogs.com/dolphin0520/p/3923167.…
在JDK1.5发布后,提供了Synchronized的更优解决方案:Lock 和 Condition 我们使用这些新知识,来改进例子:[多线程]--生产者消费者模式--Synchronized版本 改进代码如下: package com.shindo.java.thread; import java.util.concurrent.locks.*; /** * Jdk 1.5中,提供了多线程升级解决办法 * 将同步Synchronized 替换为显示的Lock操作 * 将Object中的wait…
package com.java.concurrent; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; /** * 生产者消费者模式 * @author fliay * */ public class TestProductorAndConsumerByLock { publi…
package reentrantlock; import java.util.ArrayList; public class ProviderAndConsumerTest { static ProviderAndConsumer providerAndConsumer = new ProviderAndConsumer(); public static void main(String[] args) throws InterruptedException { // new Thread(n…
说明 ReentrantLock是java官方的一个线程锁类,ReentarntLock实现了Lock的接口 我们只需要使用这个,就可以不用使用synchronized同步关键字以及对应的notifyall方法和wait方法去写我们的生产者消费者模式. 这样就可以大大简化我们的代码 代码 Producer.java package producterandcustomer; import java.util.List; import java.util.concurrent.locks.Lock…
1.wait/notifyAll /** * 面试题:写一个固定容量同步容器,拥有put和get方法,以及getCount方法, * 能够支持2个生产者线程以及10个消费者线程的阻塞调用 * * 使用wait和notify/notifyAll来实现 * * @author cx */ package com.chanx.demo.example.c_021; import java.util.LinkedList; import java.util.concurrent.TimeUnit; pu…
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,每次线程被唤醒时会进行条件判断,是…
public class ProducterConsumerSample { public static void main(String[] args) { Resourse res = new Resourse(); //两个生产者 Producter producter1 = new Producter(res); Producter producter2 = new Producter(res); //三个消费者 Consumer consumer1 = new Consumer(res…
/* * 生产者消费者 案例 (使用Lock 同步锁 方式,使用Condition完成线程之间的通信) * */ public class TestProductorAndConsumerForLock { public static void main(String[] args) { WareHouse wareHouse = new WareHouse(); Productor pd1 = new Productor(wareHouse); Consumer cs1 = new Consu…
# 代码: public class App { public static void main(String[] args) { Depot depot = new Depot(100); Producer producer = new Producer(depot); Consumer consumer = new Consumer(depot); producer.produce(60); consumer.consume(100); producer.produce(90); consu…
二.采用Lock锁以及await和signal方法是实现 import java.io.IOException; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.ReentrantLock; /** * @author 作者 E-mail: * @version 创建时间:2015-10-23 下午04:08:39 类说明 */ public class AwaitAndSignal {…
public class Test { public static void main(String[] args) { List<String> list = new ArrayList<>(1); LockEntity lockEntity = new LockEntity(); new Thread(new PThread(list, lockEntity)).start(); new Thread(new CThread(list, lockEntity)).start()…
SDK1.5版本以后对synchronized的升级,其思想是:将同步和锁封装成对象,其对象中包含操作锁的动作. 代码: //1.导入包 import java.util.concurrent.locks.*; class Resource { private String name; private int count=1; private boolean flag=false; //创建互斥锁(相当于synchronized) Lock lock = new ReentrantLock();…
Lock锁介绍: 在java中可以使用 synchronized 来实现多线程下对象的同步访问,为了获得更加灵活使用场景.高效的性能,java还提供了Lock接口及其实现类ReentrantLock和读写锁 ReentrantReadWriteLock. 相比synchronized来实现同步,使用Lock实现同步主要有以下差异性:  1.使用synchronized关键字时,锁的控制和释放是在synchronized同步代码块的开始和结束位置.而在使用Lock实现同步时,锁的获取和释放可以在不…
多线程当中的阻塞队列 主要实现类有 ArrayBlockingQueue是一个基于数组结构的有界阻塞队列,此队列按FIFO原则对元素进行排序 LinkedBlockingQueue是一个基于链表结构的阻塞队列,此队列按FIFO排序元素,吞吐量通常要高于ArrayBlockingQueue SynchronousQueue是一个不存储元素的阻塞队列,单个插入操作必须等到另一个线程调用移除操作,否则插 入操作一直处于阻塞状态 1. 阻塞队列概念 阻塞队列通俗来说,是一个队列,而一个阻塞队列再数据结构…
并发:是指系统具有处理多个任务/动作的能力. 并行:是指系统具有同时处理多个任务/动作的能力. 并行是并发的子集. 同步:当进程执行到一个IO(等待外部数据)的时候. 异步:当进程执行到一个IO不等到数据接收成功后再回来处理. def add(): sum = 0 for i in range(1000000): sum += i print("sum",sum)def mul(): sum2 = 1 for i in range(1,100000): sum2 *= i print(…
package lockTest; import java.util.LinkedHashMap; import java.util.LinkedList; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; public class ConditionTest { private…
直接上代码: 前提是你已经 熟悉了原子类,volatile,和阻塞队列 public class JucPCdemo03 { /** * 阻塞队列的应用: 这里实现的生产者消费者,生产一个消费一个 * 且,不使用 synchronized 和 lock锁 */ private volatile boolean flag = true; private static AtomicInteger atomicInteger = new AtomicInteger(0); private Blocki…
import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.ReentrantLock; public class Five { public static void main(String[] args) { final Service myService = new Service(); for(int i = 0 ; i < 10 ; i ++){ Thread thread = new Th…
本文来自:http://www.cnblogs.com/happyPawpaw/archive/2013/01/18/2865957.html 引言 生产者和消费者问题是线程模型中的经典问题:生产者和消费者在同一时间段内共用同一个存储空间,如下图所示,生产者向空间里存放数据,而消费者取用数据,如果不加以协调可能会出现以下情况: 存储空间已满,而生产者占用着它,消费者等着生产者让出空间从而去除产品,生产者等着消费者消费产品,从而向空间中添加产品.互相等待,从而发生死锁. JAVA解决线程模型的三种…
第23章 java线程通信--生产者/消费者模型案例 1.案例: package com.rocco; /** * 生产者消费者问题,涉及到几个类 * 第一,这个问题本身就是一个类,即主类 * 第二,既然是生产者.消费者,那么生产者类和消费者类就是必须的 * 第三,生产什么,消费什么,所以物品类是必须的,这里是馒头类 * 第四,既然是线程,那么就不是一对一的,也就是说不是生产一个消费一个,既然这样,多生产的往哪里放 * 现实中就是筐了,在计算机中也就是数据结构,筐在数据结构中最形象的就是栈了,因…
生产者-消费者模型是多线程问题里面的经典问题,也是面试的常见问题.有如下几个常见的实现方法: 1. wait()/notify() 2. lock & condition 3. BlockingQueue 下面来逐一分析. 1. wait()/notify() 第一种实现,利用根类Object的两个方法wait()/notify(),来停止或者唤醒线程的执行:这也是最原始的实现. public class WaitNotifyBroker<T> implements Broker<…
Queue是什么 队列,是一种数据结构.除了优先级队列和LIFO队列外,队列都是以FIFO(先进先出)的方式对各个元素进行排序的.无论使用哪种排序方式,队列的头都是调用remove()或poll()移除元素的.在FIFO队列中,所有新元素都插入队列的末尾. Queue中的方法 Queue中的方法不难理解,6个,每2对是一个也就是总共3对.看一下JDK API就知道了: 注意一点就好,Queue通常不允许插入Null,尽管某些实现(比如LinkedList)是允许的,但是也不建议. Blockin…
什么是生产者/消费者模型 一种重要的模型,基于等待/通知机制.生产者/消费者模型描述的是有一块缓冲区作为仓库,生产者可将产品放入仓库,消费者可以从仓库中取出产品,生产者/消费者模型关注的是以下几个点: 1.生产者生产的时候消费者不能消费 2.消费者消费的时候生产者不能生产 3.缓冲区空时消费者不能消费 4.缓冲区满时生产者不能生产 生产者/模型作为一种重要的模型,它的优点在于: 1.解耦.因为多了一个缓冲区,所以生产者和消费者并不直接相互调用,这一点很容易想到,这样生产者和消费者的代码发生变化,…
引言 生产者和消费者问题是线程模型中的经典问题:生产者和消费者在同一时间段内共用同一个存储空间,如下图所示,生产者向空间里存放数据,而消费者取用数据,如果不加以协调可能会出现以下情况: 生产者消费者图 存储空间已满,而生产者占用着它,消费者等着生产者让出空间从而去除产品,生产者等着消费者消费产品,从而向空间中添加产品.互相等待,从而发生死锁. 生产者消费者问题是研究多线程程序时绕不开的经典问题之一,它描述是有一块缓冲区作为仓库,生产者可以将产品放入仓库,消费者则可以从仓库中取走产品.解决生产者/…
在Java中线程同步的经典案例,不同线程对同一个对象同时进行多线程操作,为了保持线程安全,数据结果要是我们期望的结果. 生产者-消费者模型可以很好的解释这个现象:对于公共数据data,初始值为0,多个线程对其进行增加或者减少,但是我们的目的是无论多少个线程同时操作他,结果都是:当data=0时,只能进行增加,data=1时只能进行减少. 由于代码比较简单,就把所有的类都写在同一个类里面,以静态内部类的形式出现,这样比较节省篇幅. 1.线程不安全: public class Test { publ…
同步代码块实现生产者消费者模式 class Person { private String name; private String sex; private Boolean isEmpty = Boolean.TRUE; // 表示存储区域是否为空 //生产 public void set(String name, String sex) { synchronized (this) { // if(isEmpty) while (!isEmpty.equals(Boolean.TRUE)) {…
引言 生产者和消费者问题是线程模型中的经典问题:生产者和消费者在同一时间段内共用同一个存储空间,如下图所示,生产者向空间里存放数据,而消费者取用数据,如果不加以协调可能会出现以下情况: 生产者消费者图 存储空间已满,而生产者占用着它,消费者等着生产者让出空间从而去除产品,生产者等着消费者消费产品,从而向空间中添加产品.互相等待,从而发生死锁. JAVA解决线程模型的三种方式   1.wait()和notify() import java.util.LinkedList; public class…