深入浅出Java多线程 学习记录

深入浅出Java多线程 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。进程是程序(任务)的执行过程,它持有资源(共享内存,共享文件)和线程。分析:① 执行过程 是动态性的,你放在电脑磁盘上的某个eclipse或者QQ文件并不是我们的进程,只有当你双击运行可执行文件,使eclipse或者QQ运行之后,这才称为进程。它是一个执行过程,是一个动态的概念。 阅读详情

深入浅出Java多线程
书籍地址

进程让操作系统的并发性成为了可能,而线程让进程的内部并发成为了可能。

他们两个本质的区别是是否单独占有内存地址空间及其它系统资源(比如I/O)

进程是操作系统进行资源分配的基本单位,而线程是操作系统进行调度的基本单位(熟悉的话语)

上下文是指某一时间点 CPU 寄存器和程序计数器的内容。

上下文切换通常是计算密集型的,意味着此操作会消耗大量的 CPU 时间,故线程也不是越多越好。如何减少系统中上下文切换次数,是提升多线程性能的一个重点课题。

我们可以使用线程组对线程进行批量控制。

Java中线程优先级可以指定,范围是1~10。Java只是给操作系统一个优先级的参考值

如果某个线程优先级大于线程所在线程组的最大优先级,那么该线程的优先级将会失效,取而代之的是线程组的最大优先级。

Java线程的6个状态 NEW,RUNNABLE,BLOCKED,WAITING,TIMED_WAITING,TERMINATED;

Java线程的RUNNABLE状态其实是包括了传统操作系统线程的ready和running两个状态的。

处于WAITING状态的线程变成RUNNABLE状态需要其他线程唤醒。

调用wait()方法前线程必须持有对象的锁。需要通过其他线程调用notify()或notifyAll()方法来唤醒。

sleep()只是暂时使线程停止执行,并不会释放锁。

在线程中断机制里,当其他线程通知需要被中断的线程后,线程中断的状态被设置为true,但是具体被要求中断的线程要怎么处理,完全由被中断线程自己而定,可以在合适的实际处理中断请求,也可以完全不处理继续执行下去。

线程间通信部分

在Java中,锁的概念都是基于对象的,所以我们又经常称它为对象锁。

Java多线程的等待/通知机制是基于Object类的wait()方法和notify(), notifyAll()方法来实现的。

基于volatile关键字的信号量通信,实现按照数字的变化执行线程。

sleep()与wait()有这些区别:
wait可以指定时间,也可以不指定;而sleep必须指定时间。
wait释放cpu资源,同时释放锁;sleep释放cpu资源,但是不释放锁,所以易死锁。
wait必须放在同步块或同步方法中,而sleep可以再任意位置

---------------------原理篇----------------------------------

线程间如何通信?即:线程之间以何种机制来交换信息
线程间如何同步?即:线程以何种机制来控制不同线程间操作发生的相对顺序

Java中的volatile关键字可以保证多线程操作共享变量的可见性以及禁止指令重排序,synchronized关键字不仅保证可见性,同时也保证了原子性(互斥性)。

指令重排能够提高性能。有编译器优化重排、指令并行重排、内存系统重排三种。

指令重排可以保证串行语义一致,但是没有义务保证多线程间的语义也一致。所以在多线程下,指令重排序可能会导致一些问题。

在JMM中,临界区内(同步块或同步方法中)的代码可以发生重排序

JMM不保证对64位的long型和double型变量的写操作具有原子性

happens-before规则,满足了程序员的需求–简单易懂,并提供足够强的内存可见性。针对的是两个操作之间的执行顺序,在不在一个线程内无所谓。如果操作一happens-before操作二,那么操作一的结果对操作二可见且操作一的执行顺序在操作二之前。

volatile的内存语义:1. 保证变量的内存可见性。2. 禁止volatile变量与普通变量重排序

在保证内存可见性这一点上,volatile有着与锁相同的内存语义,所以可以作为一个“轻量级”的锁来使用。在功能上,锁比volatile更强大;在性能上,volatile更有优势。

Java多线程的锁都是基于对象的,Java中的每一个对象都可以作为一个锁。

所谓“临界区”,指的是某一块代码区域,它同一时刻只能由一个线程执行。

Java6以后,一个对象有四种锁状态:无锁状态、偏向锁状态、轻量级锁状态、重量级锁状态。锁容易升级难以降级。

JVM会为每个线程在当前线程的栈帧中创建用于存储锁记录的空间

CAS是一种原子操作,它是一种系统原语,是一条CPU的原子指令,从CPU层面保证它的原子性

AQS是一个用来构建锁和同步器的框架,使用AQS能简单且高效地构造出应用广泛的同步器

JDK工具篇
线程池工作流程:来了任务,核心线程数没有到最大值则新建核心线程做,否则加入任务队列,有空闲的核心线程去取着做。任务队列满了的话,创建非核心线程做,非核心线程做完没任务了就回收。非核心线程也达到最大值了的话就依据拒绝策略丢弃任务。

四种常见线程池:
newCachedThreadPool:无核心线程,空闲60S回收。线程池很大,几乎不会触发拒绝策略。当需要执行很多短时间的任务时,CacheThreadPool的线程复用率比较高, 会显著的提高性能。
newFixedThreadPool:核心线程数=总线程数,没有非核心线程。任务队列很大,几乎不会触发拒绝策略。线程不会被回收会一直阻塞在task中。
newSingleThreadExecutor:有且仅有一个核心线程,不会创建非核心线程。所有任务按照先来先执行的顺序执行。
newScheduledThreadPool:定长线程池,支持定时及周期性任务执行。

阻塞队列(BlockingQueue)的作用,你只管往里面存、取就行,而不用担心多线程环境下存、取共享变量的线程安全问题。

BlockingQueue的实现类:
ArrayBlockingQueue:数组组成的有界阻塞队列。
LinkedBlockingQueue:链表组成的有界阻塞队列,默认大小是Integer.MAX_VALUE。
DelayQuere:无限制大小,元素需实现java.util.concurrent.Delayed 接口。只有延迟时间到了才能取出。
PriorityBlockingQueue:基于优先级的无界阻塞队列。
SynchronousQueue:没有任何内部容量,每个put必须等待一个take。

锁的分类,不同维度:
可重入锁和非可重入锁
公平锁和非公平锁
读写锁和排它锁

JDK中关于并发的类大多都在java.util.concurrent 中。

juc.locks包下共有三个接口:Condition、Lock、ReadWriteLock。

Condition类下的signal():唤醒一个等待在Condition上的线程,被唤醒的线程在方法返回前必须获得与Condition对象关联的锁,只有获得锁了才能解除await()

ReentrantLock、ReentrantReadWriteLock、StampedLock(性能优秀)

并发容器:阻塞队列(BlockingQueue),CopyOnWrite容器(CopyOnWritexxx)
ConcurrentMap接口、ConcurrentHashMap、ConcurrentNavigableMap接口与ConcurrentSkipListMap类
ConcurrentLinkedDeque和ConcurrentLinkedQueue
ConcurrentSkipListSet

所谓CopyOnWrite容器即写时复制的容器,当我们往一个容器中添加元素的时候,不直接往容器中添加,而是将当前容器进行copy,复制出来一个新的容器,然后向新容器中添加我们需要的元素,最后将原容器的引用指向新容器。 好处是我们对容器进行的是“读操作”,不需要“加锁”了,达到了读写分离。

CopyOnWrite容器有数据一致性的问题,它只能保证最终数据一致性。所以如果我们希望写入的数据马上能准确地读取,请不要使用CopyOnWrite容器。

通信工具类:Semaphore信号量限制资源数量,Exchanger两线程交换数据,CountDownLatch前置任务,CyclicBarrier循环屏障,Phaser比较复杂

深入浅出Java多线程:从基础到高效并发编程实践 本文从Java多线程的基础概念开始,讲解了线程池的使用、并发问题的解决方案(如锁、原子变量、并发集合等),并深入探讨了如何通过优化策略提升并发性能。掌握这些技术能够帮助你更好地应对复杂的并发编程挑战,提升Java程序的执行效率和响应速度。在实际应用中,合理选择并发工具和优化策略,将大大提高系统的可扩展性和稳定性。 阅读详情

相关推荐

深入浅出Java多线程.pdf

深入浅出Java多线程.pdf

代码理解java多线程 (一) - 基础篇(1)

第一章 进程与线程的基本概念 1.1 进程产生的背景 最初的计算机只能接受一些特定的指令,用户每输入一个指令,计算机就做出一个操作。当用户在思考或者输入时,计算机就在等待。这样效率非常低下,在很多时候,计算机都处在等待状态。 批处理操作系统 后来有了批处理操作系统,把一系列需要操作的指令写下来,形成一个清单,一次性交给计算机。用户将多个需要执行的程序写在磁带上,然后交由计算机去读取并逐个执行这些程序,并将输出结果写在另一个磁带上。 批处理操作系统在一定程度上提高了计算机的效率,但是由于批处理操作系

zzqtty的博客 416

深入浅出 Java 多线程.pdf_java_

深入了解Java多线程,对Java的复习有了一定的提供基础

深入浅出 Java 多线程

实际项目中,用的最多的就是ThreadPoolExecutor这个类,而《阿里巴巴Java开发手册》中强制线程池不允许使用 Executors 去创建,而是通过 new ThreadPoolExecutor 实例的方式,这样的处理方式让写的同学更加明确线程池的运行规则,规避资源耗尽的风险。我们从 ThreadPoolExecutor入手多线程创建方式,先看一下线程池创建的最全参数参数说明如下:线程池的核心线程数,即便线程池里没有任何任务,也会有corePoolSize个线程在候着等任务。

2301_82257317的博客 1123

人工智能-CS188 Project 2: Multi-agents

一、项目介绍 项目介绍网页 项目代码下载 本项目是采用Berkeley的CS188课程内容实习二的内容,在这个项目中,我们将为经典版本的Pacman 设计自动算法,包括幽灵。在此过程中,我们将实现 minimax 和 expectimax 搜索并尝试评估函数设计 完成作业只需要完成5个题目,按照项目介绍的步骤进行完成,主要是在multiAgents.py文件中进行补充代码 二、代码详情 1、Question1:Reflex Agent 略 2、Question2:Minimax 套用ppt上的minm

xiten的博客 8282

Synopsys SCL许可证服务器搭建详解:从安装到生成.dat文件

本文详细解析了Synopsys SCL许可证服务器的完整搭建流程,从系统环境准备、SCL安装到生成.dat文件。重点阐述了如何正确获取HOST ID、配置License文件以及调试常见故障,为数字芯片设计工程师提供了一套从零到一的实战避坑指南,确保EDA工具链稳定运行。

weixin_29306011的博客 610

Java刷选择题_刷题(只是选择题)

---------------------------day01虽然刷选择题有一段时间了,可是总不做笔记,这次做笔记希望坚持久一点关于C++/JAVA类中static 成员和对象成员的说法正确的是?(C)static 成员变量在对象构造时生成static 成员函数在对象成员函数中无法调用虚成员函数不可能是static 成员函数static 成员函数不能访问static 成员变量解析static成员...

weixin_33304777的博客 1194

泛微OA表单开发实战:如何用JavaScript动态控制明细表的必填与可编辑属性

本文详细介绍了如何在泛微OA系统中使用JavaScript动态控制明细表字段的必填与可编辑属性。通过主表字段变更事件监听和明细表字段属性批量修改,实现智能化的表单交互,提升用户体验和系统灵活性。文章深入解析了关键API的使用方法,并提供了实战代码示例和最佳实践。

weixin_30955617的博客 545

java递归算法代码,最全指南

美团面试经历(还原最真实的4面) 美团一面: 1、自我介绍 2、聊项目相关 介绍项目 怎么保证redis与Mysql的数据一致性 见你写了个加随机数预防缓存雪崩,解释一下 未改进和改进后的Jmter测试性能对比 3、Redis 为什么选择Redis作为缓存? 为什么Redis的性能十分的高? 说一下单进程、单线程的Redis和你平时写的多线程程序的对比 如何保证Redis的高可用?(哨兵、持久化策略RDB、AOF) 解释一下哨兵、RDB、AOF 主从一致性 Redis数据淘汰策略 能说一下分布式事务吗

m0_56146626的博客 244

Ubuntu20.04下运行LOAM系列:A-LOAM、LeGO-LOAM、SC-LeGO-LOAM、LIO-SAM 和 LVI-SAM

在我第一篇博文Ubuntu 20.04配置ORB-SLAM2和ORB-SLAM3运行环境+ROS实时运行ORB-SLAM2+Gazebo仿真运行ORB-SLAM2+各种相关库的安装的基础环境下跑通A-LOAM首先已经按照上一篇文章已经安装好了ROS noetic、Eigen3.4.0、OpenCV4.2.0和PCL1.10,A-LOAM在Github的开源地址:https://github.com/HKUST-Aerial-Robotics/A-LOAM。接下来根据代码要求,需要安装Ceres,另外环境的变

zardforever123的博客 3万+

大模型部署指南:SGLang 框架

本文介绍使用 SGLang 框架部署大模型

举世誉之而不加劝,举世非之而不加沮,定乎内外之分,辩乎荣辱之境,斯已矣。 1611

四个月,我们终于写完了《深入浅出Java多线程》

GitBook开源书籍《深入浅出Java多线程》终于要发布啦!有太多的话想说,但还是先上几个数据吧。 1个技术社区,5个人,用了3个多月的时间,写了一本20章、10万字+的多线程Gitbook。2018年11月3日第一个提交,到2019年3月3日,时间刚好过去整整四个月。 两百多次的提交记录,十二次迭代会议,社区成员共计数百小时的业余时间,每篇文章5次以上的修订。这就是关于这本书的数据。 成立Re...

weixin_34265814的博客 668

从 VS Code 创建 ABAP Development Objects,包、命名、传输请求和 Clean Core 的一条线打通

文章摘要: SAP ABAP开发工具正从传统SAP GUI/Eclipse向VS Code迁移,通过ABAP Development Tools扩展实现代码编辑、调试和传输管理。文章重点分析了创建ABAP对象背后的治理逻辑:1)对象创建涉及包结构、命名规范、传输层等关键设计决策;2)VS Code通过命令面板(Ctrl+Shift+P)提供统一创建入口;3)对象类型选择反映架构意图,应从业务模型角度规划;4)Package是重要的治理边界,需按业务能力分区;5)命名和描述需体现业务语义;6)传输请求标记对象

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 173

#软件构造# 浅谈Java多线程 -暨软件构造Lab6记录

欢迎访问个人博客:https://lyp123.com 终于完成所有的lab了,在最后的这个lab里面接触到了多线程,甚感其高效也有感于其危险的地方,这里就大概记录一下,以免以后需跳坑。 1.Java多线程入门 1.1 Thread类与Runnable接口 要学习Java多线程,首当其冲的就是Thread类和基于这个类的Runnable接口,这里不多做解释,大家直接看代码就好。 /** *方法...

小明难亡 772

【原理图PCB专题】原理图图纸锁定/解锁与PCB文件加密方式

在工作中我们会遇到需要冻结原理图进行评审和加密图纸防止被他人盗用的需求。那么在OrCAD Capture中如何对图纸进行锁定与解锁,如何在Allegro中对PCB工程进行加密呢?

一点硬件 3255

Unity的粒子系统使用shadergraph(内置管线)制作的一个顶点偏移shader,但是粒子模型移动时,顶点也会偏移?

🏆本文收录于 《全栈Bug调优(实战版)》 专栏,该专栏专注于分享我在真实项目开发中遇到的各类疑难Bug及其深层成因,并系统提供高效、可复现的解决思路和实操方案。无论你是刚入行的新手开发者,还是拥有多年项目经验的资深工程师,本专栏都将为你提供一条系统化、高质量的问题排查与优化路径,助力你加速成长,攻克技术壁垒,迈向技术价值最大化与职业发展的更高峰🚀!

**My Coding Family** 1174

多线程学习系列-初探深入浅出Java多线程-入门

简介:本次记录多线程是日常开发中的常用知识,也是难用知识。了解Java中多线程相关的基本概念,如何创建,启动和停止线程?什么是正确的多线程,怎样编写多线程程序。 一,进程和多线程简介 相关概念: 1.线程: 线程(thread台湾称 执行绪)是进程中某个单一顺序的控制流。也被称为轻量进程(lightweight processes)。线程是进程的一个实体,是CPU调度和分派的基本单位,它是...

m0_37476890的博客 215

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

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

自己记录的一些Java后端面试题(上)

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 欢迎使用Ma...

atomatom98的博客 1957

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

Java学习之路-day22 多线程01

Java多线程每日一句1.实现多线程1.1简单了解多线程1.2并发和并行1.3进程和线程1.4实现多线程方式一:继承Thread类1.5实现多线程方式二:实现Runnable接口1.6实现多线程方式三: 实现Callable接口1.7设置和获取线程名称1.8线程休眠1.9线程优先级1.10守护线程2.线程同步2.1卖票2.2卖票案例的问题2.3同步代码块解决数据安全问题2.4同步方法解决数据安全问题2.5Lock锁2.6死锁3.生产者消费者3.1生产者和消费者模式概述3.2生产者和消费者案例3.3生产者和消

weixin_43441789的博客 507

深度学习工具包 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面试-Offer直通车》--Java多线程与并发

进程和线程的区别

lucky_jiexia的博客 4867

深入浅出理解Java NIO

简述JAVA NIO概念与NIO 和 BIO的对比,深入理解NIO的三大核心组件 Channel通道、Buffer缓冲区、Selector选择器和NIO中的reactor模式并附上详细模拟实例代码

xiaoxiya55的博客 499

Java 多线程

Java 给多线程编程提供了内置的支持。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。 多线程是多任务的一种特别的形式,但多线程使用了更小的资源开销。多线程能满足程序员编写高效率的程序来达到充分利用 CPU 的目的。

Dailyblue的专栏 849

java多线程练习题

java多线程练习题

xwt1130_的博客 1321

多线程 《深入浅出 Java Concurrency》目录

http://ifeve.com/java-concurrency-thread-directory/ 《深入浅出 Java Concurrency》目录       http://www.blogjava.net/xylz/archive/2010/07/08/325587.html             这是一份完整

liangxw1的专栏 614

深入浅出Java多线程从基础概念到高级应用实战指南

Executors工厂类创建多种线程池,如固定大小线程池(newFixedThreadPool)、缓存线程池(newCachedThreadPool)和调度线程池(newScheduledThreadPool)。线程的生命周期包含新建(New)、就绪(Runnable)、运行(Running)、阻塞(Blocked)和终止(Terminated)五种状态。Java通过原生synchronized关键字和java.util.concurrent包提供线程同步支持,确保共享资源访问的原子性、可见性和有序性。

liyugang2015的博客 408
上一篇: FreeMarker 学习记录
下一篇: 记一下nginx配置Halo的问题
一只小小翠
博客等级 码龄9年 154粉丝 48原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值