生产者消费者

Java并发编程初级篇(十六):Lock+Condition实现生产者消费者问题

|▌冷眼眸甩不掉的悲伤 提交于 2020-03-02 10:00:01
之前我们在“ Java并发编程初级篇(十二):使用wait和notify生产者消费者问题 ”,已经使用Java提供的synchronized关键字和wait(),notify(),notifyAll()方法实现过来生产者消费者问题。Java API还为我们提供了锁的解决方案。 使用锁解决阻塞要用到Condition,它是通过Lock.newCondition()来获得的。就像wait()和notify()必须在synchronized块内一样,Condition.await()和Condition.singialAll()方法也必须在Lock.lock()和Lock.unlock()内执行。 代码示例: 首先我们实现一个数据缓冲区,缓冲区中定义了maxSize变量来代表缓冲区大小,LinkedList来模拟缓冲区。然后添加一把锁,并用这把锁来新建两个Condition:producer(控制生产者挂起和唤醒)和consumer(控制消费者挂起和唤醒)。当生产者发现缓冲区满的情况下调用producer.await()挂起,等待消费者消费数据后调用producer.singialAll()方法来唤醒,并重新判断缓冲区状态。当消费者发现缓冲区空的情况下调用consumer.await()挂起,等待生产者向缓冲区中放入数据并调用consumer.singialAll(

Java并发编程初级篇(十二):使用wait和notify生产者消费者问题

我是研究僧i 提交于 2020-03-02 09:27:11
在这里我们模拟一个生产者消费者问题。定义一个缓冲区,生产者生产数据并存入缓冲区,消费者从缓冲区中消费数据。缓冲区有固定大小,当缓冲区达到最大时生产者被挂起并等待消费者消费数据后再尝试将生产的数据加入缓冲区;当缓冲区数据量为0时,消费者被挂起直到有生产者向缓冲区中存入数据。 我们可以看到这个缓冲区是一个公共变量,所以缓冲区中数据的存放和取出都必须放置在一段synchronized修饰的同步代码中。 Java API的Object类提供了一组方法wait(),notify()和nofityAll()用于实现这个例子。 示例代码: 首先我们创建一个类来模拟实现一个阻塞数据缓冲池,这个缓冲池有一个链表结构用于缓冲数据,有一个整形变量用于定义数据缓冲区大小。一个set()方法用于模拟生产者向缓冲区内加入数据,一旦数据缓冲区满则挂起,成功插入数据后唤起所有消费者线程。一个get()方法用于模拟消费者从缓冲区中消费数据,一旦数据缓冲区空了则挂起,成功消费数据后唤起所有生产者线程。 public class EventStorage { private int maxSize; private LinkedList<Date> storage; public EventStorage() { maxSize = 10; storage = new LinkedList<Date>(); }

Kafka集群简单测试

给你一囗甜甜゛ 提交于 2019-12-01 00:29:51
接上篇 Linux系统Kafka集群搭建与简单测试 ,做简单的测试 新建common工程 新建listen-kafka-common工程,主要放置生产端和消费端公用部分代码 工程目录截图如下图 pom.xml文件如下 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>listen-kafka</groupId> <artifactId>listen-kafka-parent</artifactId> <version>0.0.1-SNAPSHOT</version> </parent> <packaging>jar</packaging> <artifactId>listen-kafka-common</artifactId> <dependencies> <dependency> <groupId>com.alibaba<

[高并发Java 七] 并发设计模式

 ̄綄美尐妖づ 提交于 2019-11-30 01:14:59
1. 什么是设计模式 在软件工程中,设计模式(design pattern)是对软件设计中普遍存在(反复出现)的各种问题 ,所提出的解决方案。这个术语是由埃里希·伽玛(Erich Gamma)等人在1990年代从建筑设计领 域引入到计算机科学的。 著名的4人帮: Erich Gamma, Richard Helm, Ralph Johnson ,John Vlissides (Gof) 《设计模式:可复用面向对象软件的基础》收录23种模式 2. 单例模式 单例对象的类必须保证只有一个实例存在。许多时候整个系统只需要拥有一个的全局对象,这样有利于我们协调系统整体的行为 比如:全局信息配置 单例模式最简单的实现: public class Singleton { private Singleton() { System.out.println("Singleton is create"); } private static Singleton instance = new Singleton(); public static Singleton getInstance() { return instance; } } 由私有构造方法和static来确定唯一性。 缺点:何时产生实例 不好控制 虽然我们知道,在类Singleton第一次被加载的时候,就产生了一个实例。