Java (多)生产者与消费者模式

生产者消费者问题(多生产者多消费者多缓冲区)——Java多线程 题目要求: 提供三种场景供用户选择: 1、单生产者单消费者单缓冲区 2、多生产者多消费者单缓冲区 3、多生产者多消费者多缓冲区 用户可以自由选择三种场景,并输入可选择参数。 场景解析 1、单生产者单消费者单缓冲区:为一对一的情况,所需要考虑的仅有生产者和消费者对缓冲区的互斥操作。 2、多生产者多消费者单缓冲区:不仅要考虑生产者消费者之间的互斥,为了避免多个生产者生产的产品放到缓冲区中的同一个位置、多个消费者消费同一个产品,还要考虑生产者之间、消费者之间的互斥关系。 3、多生产者多消费者多缓冲区:与前. 阅读详情

生产者与消费者模型是Java多线程中的常见经典模型。为此特写一篇博客记录该模式中线程不安全问题的产生以及解决方案。

一、单消费者与单生产者模式

所谓生产者消费者模式,就是指一个/多个线程生产东西(往资源中赋值等),另一个/多个线程消费资源中的东西(输出资源中的内容等)。下面这个例子为一个线程赋值名字和性别,另一个线程负责输出名字和性别。


class Resource{
	String name;
	String sex;
	boolean flag = true;
}

class Input implements Runnable{
	Resource r;
	Input(Resource r){
		this.r = r;
	}		
	public void run() {
		while(true) {
			synchronized (r) {
				if(r.flag) {
					r.name = "john";
					r.sex = "------->male";
					r.flag = false;
				} else {
					r.name = "lilly";
					r.sex = "----------->female";
					r.flag = true;
				}
			}
		}
	}
}

class Output implements Runnable{
	Resource r;
	Output(Resource r){
		this.r = r;
	}		
	public void run() {
		while(true) {
			synchronized (r) {
				try {
					Thread.sleep(300);
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				System.out.println(r.name+r.sex);
			}
		}
	}		
}

public class Demo {
	
	public static void main(String[] args) {
		Resource r = new Resource();
		Input in = new Input(r);
		Output out = new Output(r);
		Thread t1 = new Thread(in);
		Thread t2 = new Thread(out);
		t1.start();t2.start();

	}
}

注意这里同步的使用。如果不加同步的话,在修改完姓名后输出线程可能会得到执行权并执行输出语句。此时性别并没有修改,所以可能会出现如john------->female性别不统一的线程问题。同步的锁必须是同一个(这里为资源r),每一个锁都会管理属于自己的一组线程。如果将Ouput中同步代码块中的锁换成别的锁(比如new Object())或者不加锁,都不会使得Ouput被r锁管理,进而导致线程安全问题的出现。

可以看到,Input、Output中的锁都为r。所以可以把Input、Output变为Resource中的同步函数,他们俩的锁也都为调用他们的同一个r对象(this)。

class Resource{
	private String name;
	private String sex;
	private boolean flag = true;
	
	public synchronized void set() {
		if(this.flag) {
			this.name = "john";
			this.sex = "------->male";
			this.flag = false;
		} else {
			this.name = "lilly";
			this.sex = "----------->female";
			this.flag = true;		
		}
	}
	
	public synchronized void show() {
		try {
			Thread.sleep(300);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		System.out.println(this.name+this.sex);	
	}
}

class Input implements Runnable{
	Resource r;
	Input(Resource r){
		this.r = r;
	}		
	public void run() {
		while(true) {
			r.set();
		}
	}
}

class Output implements Runnable{
	Resource r;
	Output(Resource r){
		this.r = r;
	}		
	public void run() {
		while(true) {
			r.show();
		}		
	}
}

public class Demo {
	
	public static void main(String[] args) {
		Resource r = new Resource();
		Input in = new Input(r);
		Output out = new Output(r);
		Thread t1 = new Thread(in);
		Thread t2 = new Thread(out);
		t1.start();t2.start();

	}
}

二、多消费者与多生产者模式

首先介绍一下wait()、notify()、notifyAll()的使用:

wait():将当前线程释放资源进入等待阻塞状态。

notify():随机唤醒所属于当前锁的线程池中的任意一个线程,使其可以被调度。

notifyAll():唤醒所属于当前锁的线程池中的所有线程。

由于任何的对象都可以作为锁,所以这三个方法定义在Object类中。因此这三个对象必须在同步代码块中才可以使用,且必须由所属的锁调用(锁.wait()/notify()/notifyAll())。下面这段代码为生产一只烤鸭,消费一只烤鸭。

class Resource{
	private String name ;
	private int num = 1;
    boolean flag = true;
	
	public synchronized void set() {
		//若t1调度完后下一次仍是t1,则判断flag让t1等待不继续生产,在t2消费完改变标记后继续生产
		if(!this.flag)
			try {
				this.wait();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		
		this.name = "duck"+"------>"+num;
		System.out.println("生产"+this.name);
		num++;
		this.flag = false;
		this.notify();
	}
	
	public synchronized void show() {
		if(this.flag)
			try {
				this.wait();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		System.out.println("消费"+this.name);	
		this.flag = true;
		this.notify();
	}
}


class Input implements Runnable{
	Resource r;
	Input(Resource r){
		this.r = r;
	}		
	public void run() {
		while(true) { 
			r.set();			
		}
	}
}

class Output implements Runnable{
	Resource r;
	Output(Resource r){
		this.r = r;
	}		
	public void run() {
		while(true) {
			r.show();
		}		
	}
}

public class Demo {
	
	public static void main(String[] args) {
		Resource r = new Resource();
		Input in = new Input(r);
		Output out = new Output(r);
		Thread t1 = new Thread(in);
		Thread t2 = new Thread(out);
		t1.start();t2.start();
	}
}

在只有一个线程生产,一个线程消费的时候,程序是和谐的。但在多生产者多消费者模式时,会有以下安全性问题产生:

class Resource{
	private String name ;
	private int num = 1;
    boolean flag = true;
	
	public synchronized void set() {
		if(!this.flag)
			try {
				this.wait();    //如果原先wait再被唤醒继续执行的话从此处开始
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		
		this.name = "duck"+"------>"+num;
		System.out.println("生产"+this.name);
		num++;
		this.flag = false;
		this.notify();
	}
	
	public synchronized void show() {
		if(this.flag)
			try {
				this.wait();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		System.out.println("消费"+this.name);	
		this.flag = true;
		this.notify();
	}
}


class Input implements Runnable{
	Resource r;
	Input(Resource r){
		this.r = r;
	}		
	public void run() {
		while(true) { 
			
			r.set();			
		}
	}
}

class Output implements Runnable{
	Resource r;
	Output(Resource r){
		this.r = r;
	}		
	public void run() {
		while(true) {
			try {
				Thread.sleep(500);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			r.show();
		}		
	}
}

public class Demo {
	
	public static void main(String[] args) {
		Resource r = new Resource();
		Input in = new Input(r);
		Output out = new Output(r);
		Thread t1 = new Thread(in);
		Thread t2 = new Thread(in);
		Thread t3 = new Thread(out);
		Thread t4 = new Thread(out);
		t1.start();t2.start();
		t3.start();t4.start();

	}
}

输出:

生产duck------>1
消费duck------>1
消费duck------>1
消费duck------>1
消费duck------>1

这是因为,在t1、t2、t4wait时,当t3消费duck------>1后,t3notify()了t4线程(t4A处于wait状态),t4拿到了CPU执行权,多消费了duck------>1,产生了线程不安全问题。

这个问题的原因在于if判断上。当t4拿到执行权后,不会重新判断flag(会继续从wait出开始执行),即使t3已经把flag改为了true。因此貌似把if改为while让t4回头重新判断一下标记即可。可真的是这样吗?

class Resource{
	private String name ;
	private int num = 1;
    boolean flag = true;
	
	public synchronized void set() {
		while(!this.flag)
			try {
				this.wait();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		
		this.name = "duck"+"------>"+num;
		System.out.println("生产"+this.name);
		num++;
		this.flag = false;
		this.notify();
	}
	
	public synchronized void show() {
		while(this.flag)
			try {
				this.wait();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		System.out.println("消费"+this.name);	
		this.flag = true;
		this.notify();
	}
}


class Input implements Runnable{
	Resource r;
	Input(Resource r){
		this.r = r;
	}		
	public void run() {
		while(true) { 
			
			r.set();			
		}
	}
}

class Output implements Runnable{
	Resource r;
	Output(Resource r){
		this.r = r;
	}		
	public void run() {
		while(true) {
			r.show();
		}		
	}
}

public class Demo {
	
	public static void main(String[] args) {
		Resource r = new Resource();
		Input in = new Input(r);
		Output out = new Output(r);
		Thread t1 = new Thread(in);
		Thread t2 = new Thread(in);
		Thread t3 = new Thread(out);
		Thread t4 = new Thread(out);
		t1.start();t2.start();
		t3.start();t4.start();

	}
}

如果将此段程序多运行几次,会发现死锁的产生。这是因为notify()只会随即唤醒一个线程。当t2、t3、t4处于wait状态,t1处于运行状态时,t1在唤醒t2并改变flag后再次获得执行权,t1处于wait状态。此时t2获得执行权,回头再判断flag,也进入wait状态。此时四个线程全部wait,造成了死锁。

那么如何解决?很简单,只需要使用notifyAll()将所有线程全部唤醒即可。这样即使己方的线程全部处于wait状态,也会有对方的两个线程具有执行资格(其中一个具有执行权),永远不会造成死锁。

class Resource{
	private String name ;
	private int num = 1;
    boolean flag = true;
	
	public synchronized void set() {
		while(!this.flag)
			try {
				this.wait();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		
		this.name = "duck"+"------>"+num;
		System.out.println("生产"+this.name);
		num++;
		this.flag = false;
		this.notifyAll();
	}
	
	public synchronized void show() {
		while(this.flag)
			try {
				this.wait();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		System.out.println("消费"+this.name);	
		this.flag = true;
		this.notifyAll();
	}
}


class Input implements Runnable{
	Resource r;
	Input(Resource r){
		this.r = r;
	}		
	public void run() {
		while(true) { 
			r.set();			
		}
	}
}

class Output implements Runnable{
	Resource r;
	Output(Resource r){
		this.r = r;
	}		
	public void run() {
		while(true) {
			r.show();
		}		
	}
}

public class Demo {
	
	public static void main(String[] args) {
		Resource r = new Resource();
		Input in = new Input(r);
		Output out = new Output(r);
		Thread t1 = new Thread(in);
		Thread t2 = new Thread(in);
		Thread t3 = new Thread(out);
		Thread t4 = new Thread(out);
		t1.start();t2.start();
		t3.start();t4.start();

	}
}

三、使用ReentrantLock优化解决

如果使用notifyAll()的话,己方线程也会被唤醒,但是并不需要。这会导致效率的降低。可以使用ReentrantLock与Condition配合解决这个问题,使得唤醒更加精确。

Lock接口:

synchronized中的锁为隐式操作,使用Lock接口后可以把锁转变显式操作。同事一个Lock还可以挂多个Condition监视器对象。

lock():获取锁。

unlock():释放锁。

ReentrantLock:

属于Lock的实现类,是一个互斥锁,也就是如果一个线程拿到了改锁,别的线程无法拿到。

Condition接口:

由于synchronized中只能使用一组监视器方法(wait、notify、notifyAll),所以产生了Condition对象使得一个锁可以挂载多个监视器对象来使用多组监视器方法。Condition封装了以上三个方法:

wait()-------->await()

notify()-------->signal()

notifyAll()-------->signalAll()

import java.util.concurrent.locks.*;;

class Resource{
	private String name ;
	private int num = 1;
    boolean flag = true;
	Lock lock = new ReentrantLock();
    Condition produer_con = lock.newCondition();
    Condition Consumer_con = lock.newCondition();
    
	public void set() {
		lock.lock();
		while(!this.flag)
			try {
				produer_con.await();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		
		this.name = "duck"+"------>"+num;
		System.out.println("生产"+this.name);
		num++;
		this.flag = false;
		Consumer_con.signal();
		lock.unlock();
	}
	
	public void show() {
		lock.lock();
		while(this.flag)
			try {
				Consumer_con.await();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		System.out.println("消费"+this.name);	
		this.flag = true;
		produer_con.signal();
		lock.unlock();
	}
}
 
 
class Input implements Runnable{
	Resource r;
	Input(Resource r){
		this.r = r;
	}		
	public void run() {
		while(true) { 
			r.set();			
		}
	}
}
 
class Output implements Runnable{
	Resource r;
	Output(Resource r){
		this.r = r;
	}		
	public void run() {
		while(true) {
			r.show();
		}		
	}
}
 
public class Demo {
	
	public static void main(String[] args) {
		Resource r = new Resource();
		Input in = new Input(r);
		Output out = new Output(r);
		Thread t1 = new Thread(in);
		Thread t2 = new Thread(in);
		Thread t3 = new Thread(out);
		Thread t4 = new Thread(out);
		t1.start();t2.start();
		t3.start();t4.start();
 
	}
}

 

论文理解【LLM-OR】——【Step-Opt】Training LLMs for Optimization Modeling via Iterative Data Synthesis and 本文提出 Step-Opt-Instruct 方法,针对用 LLM 做 OR 问题求解任务,用迭代问题生成 + 分步验证机制实习更可靠的训练数据合成,从而微调开源 LLM 得到 Step-Opt。在多个 OR 建模基准提升性能,尤其在复杂问题上提升更明显 阅读详情

相关推荐

Android 以太网802.1x 配置

802.1X认证网络配置摘要:本文介绍了通过wpa_supplicant.conf文件配置802.1X企业网络认证的两种方法:PEAP-MSCHAPv2方式和TLS方式。PEAP方式需设置SSID、用户名、密码,可选择是否验证CA证书;TLS方式则需要配置客户端证书、私钥及CA证书路径。文件配置完成后需设置权限并重启设备。最后提出如何验证802.1X配置是否生效的问题,但未给出具体验证方法。该配置适用于需要802.1X认证的企业网络环境。

zhaoyufei133的博客 458

多生产者-单消费者模型

#include <unistd.h> #include <cstdlib> #include <condition_variable> #include <iostream> #include <mutex> #include <thread> static const int kItemR...

weixin_30920091的博客 408

Wincc7.5SP1 按钮操作记录(二次确认及语音播报)

Wincc 7.5 SP1 按钮操作记录生成(含二次确认及语音播报) 前面一篇文章已经介绍了“语音播报WINCC报警”,本文是之前功能的延伸,记录按钮操作记录并实现播报。 操作记录及语音播报效果 <创建消息文本> 1. 创建消息文本 消息编号100,消息等级“系统无确认”,消息类型“操作员输入消息”,消息文本“循环水泵启动操作”,其他参数默认。 消息编号101,消息等级“系

徐站的春天 1万+

多个生产者——多个消费者模型(互斥量条件变量实现)

1. 介绍 生产者消费者问题属于有界缓冲区问题。我们现在讲述多个生产者向一个缓冲区中存入数据,多个生产者从缓冲区中取数据。 共享缓冲区作为一个环绕缓冲区,存数据到头时再从头开始。 2. 实现 我们使用一个互斥量保护生产者向缓冲区中存入数据。 由于有多个生产者,因此需要记住现在向缓冲区中存入的位置。 使用一个互斥量保护缓冲区中消息的数目,这个生产的数据数目作为生产者和消费者沟...

weixin_30741653的博客 621

DataGrip 2023.3 Windows版激活保姆级教程:从下载脚本到输入激活码,一次搞定

本文提供DataGrip 2023.3 Windows版的完整安装与授权指南,从环境准备到数据库连接管理,再到高效开发技巧与高级功能扩展,帮助开发者快速掌握这一专业数据库管理工具。内容涵盖安装步骤、初始配置、常见问题解决及性能调优技巧,适合数据库开发新手和专业人士。

weixin_30275415的博客 643

AD9613操作控制

输出250M时钟给AD9613,过FPGA ILA逻辑分析仪将AD9613采集的两个通道ADC数据250M数据显示出来。其中AD9613输出的是LVDS数据,通过select IO核转为并行数据。 一,搜索IP核:selectIO interface wizad ,并双击配置 配置为input,DDR模式,数据位宽为12bit,IO类型为差分,这里配置的是12对数据差分对。然后配置外部差分时钟。 将tap setting 设置为13,将时钟的边沿对准数据的中间,以免数据出错 二,

wangjie36的博客 4047

基于环形队列的多生产者多消费者模型(同时维护互斥和同步关系)

之前的单生产者单消费者模型维护的只是生产者和消费者之间的同步关系,但是对于多生产者多消费者,就需要另外维护生产者和生产者之间的互斥关系。

challenglistic的博客 776

《Android最全面试题-Offer直通车》目录

如今Android求职是僧多粥少,竞争非常激烈,企业招聘时要求很高,本专栏汇聚android面试各种考点,各大公司Android面试题,《Android 最全面试题》将助你全方位提升,助您脱颖而出,早日拿到满意Offer。本专栏汇聚了海量优质内容,文章数量超过100 篇。凭借过硬的质量,每月新增订阅用户数以百计,如今仅需特惠价 9.9 元,限时抢购,后续将逐步恢复原价,早订阅早开启逆袭之旅。精心筹备,整理出一系列超万字精华篇章,累计数十万的 Android 面试题深度剖析。

大模型大数据攻城狮的专栏 2867

Java性能优化最佳实践,附答案

一,阿里巴巴面试题 二,百度面试题 三,蚂蚁金服面试题 四,美团面试题 五,携程面试题 六,所有面试题所得结论 通过面试题来看,可以看出目前互联网公司面试考点为: 性能调优、算法数据机构 高并发下数据安全、接口冪等性、原子性等 分布式下协同、已经锁的处理 数据库的分库分表、项目之间的垂直拆分 最后的内容 在开头跟大家分享的时候我就说,面试我是没有做好准备的,全靠平时的积累,确实有点临时抱佛脚了,以至于我自己还是挺懊恼的。(准备好了或许可以拿个40k,没做准备只有30k+,你们懂那种感

m0_57286679的博客 246

【TC3xx芯片】TC3xx DMA模块详解

TC3xx DMA模块详解

qq_36056498的博客 5917

[Dify实战] 合同审阅助手:识别风险条款、生成修改建议-带绑定资源

摘要: Dify合同审阅助手通过AI技术提升合同审阅效率,快速识别风险条款并输出结构化修改建议。方案包括合同输入、关键条款识别、风险评级和报告生成流程,重点关注付款、责任限制等核心条款。采用分层风险分级(高/中/低)和"红线清单"机制,确保审阅标准化。实施建议先建立条款库和模板,通过样本测试优化模型,定期更新规则库。该方案可缩短审阅时间50%以上,提高风险识别准确率,最终实现法务经验的可复用沉淀。

技术小甜甜:传播可落地技术,帮助个人和企业降低解决真实场景问题的成本 597

多生产者多消费者模型&封装

多生产多消费者模型原理,实现;信号量/锁的使用;阻塞队列原理;互斥原理;

li_peixiansang的博客 727

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

【多、单】生产者消费者模式——Java

实现代码 下面是多生产者多消费者的实现, import java.util.ArrayDeque; import java.util.Deque; /**生产者、消费者。单生产者、消费者,多生产者消费者。要注意以下三点: * 如果队列为空,则消费者阻塞 * 如果队列满了,则生产者阻塞 * 任何时候,只能有一个生产者或者消费者访问队列 * @author zkw * @date 2021/1/4 10:07 */ public class ProducerAn

奋进的小白粥 1029

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

生产者与消费者设计模式(一对一,一对多,多对多)——Java实现

第一次发文,如有错误,欢迎指正。 1.首先,我们创建一个消费对象。 public class StaticVariate { public static List Pc = new ArrayList(); } 2.创建生产者 public class Prodecer { public String lock; public Prodecer(String ...

qq_37592936的博客 3105

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

基于Java 生产者消费者模式(详细分析)

本文目录: 1.等待、唤醒机制的原理 2.Lock和Condition 3.单生产者单消费者模式 4.使用Lock和Condition实现单生产单消费模式 5.多生产多消费模式(单面包) 6.多生产多消费模式   生产者消费者模式是多线程中最为常见的模式:生产者线程(一个或多个)生成面包放进篮子里(集合或数组),同时,消费者线程(一个或多个)从篮子里(集合或数组)取出面包消耗。虽然它们任务不同...

yunheli6451的博客 226

java消费者模式_基于Java 生产者消费者模式(详细分析)

生产者消费者模式是多线程中最为常见的模式:生产者线程(一个或多个)生成面包放进篮子里(集合或数组),同时,消费者线程(一个或多个)从篮子里(集合或数组)取出面包消耗。虽然它们任务不同,但处理的资源是相同的,这体现的是一种线程间通信方式。本文将先说明单生产者单消费者的情况,之后再说明多生产者多消费者模式的情况。还会分别使用wait()/nofity()/nofityAll()机制、lock()/un...

weixin_36336411的博客 637

Java中的设计模式(二):生产者-消费者模式与观察者模式

工具与资源中心 帮助开发者更加高效的工作,提供围绕开发者全生命周期的工具与资源 https://developer.aliyun.com/tool?spm=a1z389.11499242.0.0.65452413KlyaNB&utm_content=g_1000283979 一、前言   在上一篇 Java中的设计模式(一):观察者模式 中我们了解了 观察者模式 的基本原理和使用场景,在今天的这篇文章中我们要做一点简单的延伸性学习——对比一下 生产者-消费者模式 和 观察者模式 的异同。

m0_60028455的博客 642

java生产线消费者,基于Java 生产者消费者模式(详细分析)

生产者消费者模式是多线程中最为常见的模式:生产者线程(一个或多个)生成面包放进篮子里(集合或数组),同时,消费者线程(一个或多个)从篮子里(集合或数组)取出面包消耗。虽然它们任务不同,但处理的资源是相同的,这体现的是一种线程间通信方式。本文将先说明单生产者单消费者的情况,之后再说明多生产者多消费者模式的情况。还会分别使用wait()/nofity()/nofityAll()机制、lock()/un...

weixin_42522320的博客 169

Java 多线程 生产者消费者问题

Java 多线程 生产者消费者问题 在生活中经常会遇到两方都在处理同一资源,而处理的方式不同。比如:水池中注水和排水,煤场中往进运煤和往出拉煤。这些操作处理的资源都相同,只是他们操作的方式有所不同。这类操作就多线程中另外一种高级应用,即多生产和多消费。 生产者的主要作用是生成一定量的数据资源,然后重复此过程,消费者不断消耗这些数据。两者间需要通过线程间的通信来共同操作数据。 生产者消费者的代码实现 思路: 描述处理的资源。 描述生产者,具备着生产的任务。 描述消费者,具备着消费的任务。 //描述资源。属

枣知稻ZZD的博客 374

《多线程操作之生产者消费者》(单生产单消费&多生产多消费)

说明1:假设有一个放商品的盘子(此盘子只能放下一个商品)。生产者每次生产一个商品之后,放到这个盘子里,然后唤醒消费者来消费这个面包。消费者消费完这个商品之后,就唤醒生产者生产下一个商品。前提是,只有盘子里没有商品时,生产者才生产商品,只有盘子里有商品时,消费者才来消费。因此第一个程序是一个“单生产” “单消费” 的问题。代码如下所示: import java.util.co...

395

生产者消费者模式实现

一对一的生产消费 多生产多消费模式 一生产者和多消费者 生产者和消费者模式,主要就是基于等待/通信模式,在之前我们已经学习wait和notify,下面我们就来实现代码。 一对一的生产消费 public class Test226 { private static String value=""; private static Object...

venus321的博客 224

生产者消费者java算法解释_Java 生产者消费者模式详细分析

生产者消费者模式是多线程中最为常见的模式:生产者线程(一个或多个)生成面包放进篮子里(集合或数组),同时,消费者线程(一个或多个)从篮子里(集合或数组)取出面包消耗。虽然它们任务不同,但处理的资源是相同的,这体现的是一种线程间通信方式。本文将先说明单生产者单消费者的情况,之后再说明多生产者多消费者模式的情况。还会分别使用wait()/nofity()/nofityAll()机制、lock()/un...

weixin_39843847的博客 365

生产者和消费者模式实现

一生产和一消费:操作栈public class MyStack {//资源类 private List list = new ArrayList(); synchronized public void push() { try { if (list.size() == 1) { this.wait(); } list.add("anyString=" + Mat...

飞少fly的博客 254

生产者、消费者模式实现

1、1生产和1消费 一个String对象,生产者设定值,消费者拿走值。 wait()/notify()实现 生产者 public class Product { private String lock; public Product(String lock) { super(); this.lock = lock; } public...

墨玉浮白的博客 255
上一篇: Java 反射获取类信息
下一篇: [转]Java并发 Volatile关键字解析
donCoder
博客等级 码龄9年 65粉丝 79原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值