ConcurrentHashMap原理,以及在jdk7和jdk8版本的区别

volatile底层原理分析 文章目录一、CPU多核缓存架构模型1.1、早期的计算机CPU架构模型1.2、现在的计算机CPU多核缓存架构模型1.2.1、内存间交互操作1.2.2、缓存不一致的解决方式1.2.1.1、总线加锁1.2.1.2、MESI缓存一致性协议 And CPU总线嗅探机制二、JMM(Java Memory Model,Java内存模型)2.1、JMM存在的问题三、volatile底层原理3.1、并发编程的三大特... 阅读详情

ConcurrentHashMap原理,以及在jdk7和jdk8版本的区别

  • ConcurrentHashMap是线程安全的数组,是HashTable的替代品,同为线程安全,其性能要比HashTable更好

  • HashMap不是线程安全:
    在并发环境下,可能会形成环状链表(扩容时可能造成,具体原因自行百度google或查看源码分析),导致get操作时,cpu空转,所以,在并发环境中使用HashMap是非常危险的

  • HashTable是线程安全的:
    HashTable和HashMap的实现原理几乎一样,
    差别:
    HashTable不允许key和value为null;
    HashTable是线程安全的。

    HashTable线程安全的策略实现代价却比较大,get/put所有相关操作都是synchronized的,这相当于给整个哈希表加了一把大锁,多线程访问时候,只要有一个线程访问或操作该对象,那其他线程只能阻塞,见下图:
    img

这个时候,ConcurrentHashMap诞生了,不但是线程安全的,而且由于分段锁的存在, 性能上也很非常优秀

JDK7 :

数据结构: ReentrantLock + Segment + HashEntry, 一个Segment中包含一个HashEntry数组,每个HashEntry又是一个链表结构

元素查询: 二次hash,第一次定位Segment,第二次定位元素所在的链表的头部

锁 : Segment分段锁, Segment继承了ReentrantLock ,锁定操作的Segment,其他的Segment不受影响,并发度为Segment的个数,

可以通过构造函数指定,数组扩容不会影响其他的segment,get无需加锁,volatile保证内存可见性

volatile 关键字,你真的理解吗?


使用 volatile 修饰共享变量后,每个线程要操作变量时会从主内存中将变量拷贝到本地内存作为副本,当线程操作变量副本并写回主内存后,会通过 CPU 总线嗅探机制告知其他线程该变量副本已经失效,需要重新从主内存中读取。

volatile 保证了不同线程对共享变量操作的可见性,也就是说一个线程修改了 volatile 修饰的变量,当修改后的变量写回主内存时,其他线程能立即看到最新值。

接下来我们就聊聊一个比较底层的知识点:总线嗅探机制。

总线嗅探机制

在现代计算机中,CPU 的速度是极高的,如果 CPU 需要存取数据时都直接与内存打交道,在存取过程中,CPU 将一直空闲,这是一种极大的浪费,所以,为了提高处理速度,CPU 不直接和内存进行通信,而是在 CPU 与内存之间加入很多寄存器,多级缓存,它们比内存的存取速度高得多,这样就解决了 CPU 运算速度和内存读取速度不一致问题。

由于 CPU 与内存之间加入了缓存,在进行数据操作时,先将数据从内存拷贝到缓存中,CPU 直接操作的是缓存中的数据。但在多处理器下,将可能导致各自的缓存数据不一致(这也是可见性问题的由来),为了保证各个处理器的缓存是一致的,就会实现缓存一致性协议,而嗅探是实现缓存一致性的常见机制。

img

注意,缓存的一致性问题,不是多处理器导致,而是多缓存导致的。

嗅探机制工作原理:每个处理器通过监听在总线上传播的数据来检查自己的缓存值是不是过期了,如果处理器发现自己缓存行对应的内存地址修改,就会将当前处理器的缓存行设置无效状态,当处理器对这个数据进行修改操作的时候,会重新从主内存中把数据读到处理器缓存中。

注意:基于 CPU 缓存一致性协议,JVM 实现了 volatile 的可见性,但由于总线嗅探机制,会不断的监听总线,如果大量使用 volatile 会引起总线风暴。所以,volatile 的使用要适合具体场景。

使用 volatile 和 synchronized 锁都可以保证共享变量的可见性。相比 synchronized 而言,volatile 可以看作是一个轻量级锁,所以使用 volatile 的成本更低,因为它不会引起线程上下文的切换和调度。但 volatile 无法像 synchronized 一样保证操作的原子性。

volatile 的原子性问题

所谓的原子性是指在一次操作或者多次操作中,要么所有的操作全部都得到了执行并且不会受到任何因素的干扰而中断,要么所有的操作都不执行。

在多线程环境下,volatile 关键字可以保证共享数据的可见性,但是并不能保证对数据操作的原子性。也就是说,多线程环境下,使用 volatile 修饰的变量是线程不安全的。

要解决这个问题,我们可以使用锁机制,或者使用原子类(如 AtomicInteger)。

这里特别说一下,对任意单个使用 volatile 修饰的变量的读 / 写是具有原子性,但类似于 flag = !flag 这种复合操作不具有原子性。简单地说就是,单纯的赋值操作是原子性的。


容器中有多把锁,每一把锁锁一段数据,这样在多线程访问时不同段的数据时,就不会存在锁竞争了,这 样便可以有效地提高并发效率。这就是ConcurrentHashMap所采用的”分段锁”思想,见下图:

img

JDK8 :
数据结构: Synchronized + CAS +Node +红黑树.Node的val和next都用volatile保证,保证可见性,查找,替换,赋值操作都使用CAS

为什么在有Synchronized 的情况下还要使用CAS

因为CAS是乐观锁,在一些场景中(并发不激烈的情况下)它比Synchronized和ReentrentLock的效率要高,当CAS保障不了线程安全的情况下(扩容或者hash冲突的情况下)转成Synchronized 来保证线程安全,大大提高了低并发下的性能.

锁 : 锁是锁的链表的head的节点,不影响其他元素的读写,锁粒度更细,效率更高,扩容时,阻塞所有的读写操作(因为扩容的时候使用的是Synchronized锁,锁全表),并发扩容.

读操作无锁 :

  • Node的val和next使用volatile修饰,读写线程对该变量互相可见
    是Synchronized锁,锁全表),并发扩容.

读操作无锁 :

  • Node的val和next使用volatile修饰,读写线程对该变量互相可见
  • 数组用volatile修饰,保证扩容时被读线程感知
多核CPU 缓存一致性(总线嗅探、MESI协议) 本文介绍了MESI协议作为一种常见的缓存一致性协议,它通过对缓存行状态的管理和操作的同步控制,实现了事务的串行化执行。MESI协议使用四种状态来跟踪缓存行的状态,包括Modified、Exclusive、Shared和Invalid。通过正确的状态转换和处理策略,MESI协议保证了共享数据在不同处理器之间的一致性,并有效限制了对共享数据的并发访问,避免了数据的脏读和不一致问题。多核CPU缓存一致性技术是提高多核系统性能和可靠性的重要手段,深入理解和应用该技术对于开发高性能并发应用具有重要意义。 阅读详情

相关推荐

java——volatile关键字(一)

一、初识 在我们日常的计算机处理数据时,都是cpu、主内存、缓存、高速缓存。 不了解RAM的可以参考文章:RAM和ROM的区别 为什么会有高速缓存这个说法? 现在的cpu越来越贵,贵的不是材料,而是每一代的处理运算效率,这个效率的快慢,就在于cpu寄存器、cpu高速缓存的处理效率上,通俗而言,cpu的处理速率是远远高于主内存的处理速率的,为了防止cpu处理速率受限于主内存,所以在cpu和主内存...

专注写bug 1126

volatile关键字

使用 volatile 修饰共享变量后,每个线程要操作变量时会从主内存中将变量拷贝到本地内存作为副本,当线程操作变量副本并写回主内存后,会通过 CPU 总线嗅探机制告知其他线程该变量副本已经失效,需要重新从主内存中读取。 volatile 保证了不同线程对共享变量操作的可见性,也就是说一个线程修改了 volatile 修饰的变量,当修改后的变量写回主内存时,其他线程能立即看到最新值。 接下来我们就聊聊一个比较底层的知识点:总线嗅探机制。 总线嗅探机制 在现代计算机中,CPU 的速度是极高的,如.

summer_fish的专栏 707

10、ConcurrentHashMap原理,jdk7和jdk8版本的区别

10、ConcurrentHashMap原理,jdk7和jdk8版本的区别

weixin_43860634的博客 355

JUC系列(三)

1、Java内存模型 1.1、什么是Java内存模型JMM? JMM(Java内存模型Java Memory Model,简称JMM)本身是一种抽象的概念并不真实存在,它仅仅描述的是一组约定或规范,通过这组规范定义了程序中(尤其是多线程)各个变量(包括实例字段,静态字段和构成数组对象的元素)的读写访问方式。 JMM关于同步的规定: 线程解锁前,必须把共享变量的值刷新回主内存 线程加锁前,必须读取主内存的最新值,到自己的工作内存 加锁和解锁是同一把锁 JMM规范有三大特性: 可见性:可见性是指当一个线程

prefect_start的博客 1872

Linux下Catapro酶动力学预测工具保姆级安装指南(PyTorch+CUDA11.8适配版)

本文提供了Linux系统下Catapro酶动力学预测工具的详细安装指南,特别适配PyTorch+CUDA11.8环境。从环境准备、源码获取到虚拟环境创建、依赖包安装和模型配置,逐步指导用户完成安装流程,并包含常见问题排查和性能优化建议,帮助研究者快速部署这一高效酶动力学参数预测工具。

weixin_29278805的博客 210

点云中的Minkowski卷积

一、MinkowskiEngine简介 第一次见到MinkowskiEngine,应该是在两个月之前了,当时也没有去留意这个库。最近读了一些点云的论文,发现还是有不少论文的源码是基于MinkowskiEngine的,包括PointContrast(ECCV 2020),DGR(Deep Global Registration, CVPR 2020),Learning Multiview 3D Point Cloud Registration(CVPR 2020)和FCGF(Fully Convolution

zhulf0804的博客 7906

ConcurrentHashMap原理,jdk7和jdk8版本的区别

它在 JDK 7 和 JDK 8 中的实现原理有显著的区别,主要是为了提高并发性能和扩展性。锁的粒度从段级别缩小到桶级别(每个桶是一个链表或红黑树),进一步减少了锁竞争。当链表长度超过阈值(默认 8)时,链表会转换为红黑树,提高查找性能。数据结构更高效,链表和红黑树的结合提高了查找性能。获取段的锁,然后在段内的哈希表中插入或更新键值对。,锁的粒度从整个表缩小到段级别,减少了锁竞争。),每个段是一个独立的哈希表,拥有自己的锁。分段锁的粒度仍然较大,高并发场景下性能有限。:尽量减少锁的竞争,提高并发性能。

完全体 932

ISCE2+MintPy环境搭建实战:用Anaconda五分钟搞定InSAR处理全家桶

本文提供了一份详细的ISCE2+MintPy环境安装教程,旨在帮助InSAR处理初学者快速搭建开发环境。通过使用Anaconda创建虚拟环境并配置国内镜像,用户可在五分钟内一键安装ISCE2和MintPy全家桶,有效解决依赖冲突和版本兼容性问题,让用户能专注于数据处理本身。

2y3u4i5o6p的博客 1002

ConcurrentHashMap原理,jdk7和jdk8版本的区别

ConcurrentHashMap原理,jdk7和jdk8版本的区别 jdk7: 数据结构: ReentrantLock+Segment+HashEntry,一个Segment中包含一个类似于HashMap的结构,数组+链表 元素查询:二次hash,第一次Hash定位到Segment,第二次Hash定位到元素所在的链表的头部 锁: Segment分段锁Segment继承了ReentrantLock,锁定操作的Segment,其他的Segment不受影响,并发度为segment个数,可以通过构

abaidaye的博客 689

基于OpenCV的驾驶疲劳检测与预警系统设计

PERCLOS(Percentage of Eye Closure)是一种基于眼睑闭合程度的疲劳度量指标。在基于OpenCV的驾驶疲劳检测与预警系统设计中,PERCLOS可以用于检测驾驶员的眼睑闭合程度,以判断其是否疲劳。该函数用于检测视频流中人脸的疲劳程度。具体地,该函数通过检测人脸的眼睛和嘴巴的状态来评估人脸的疲劳程度。眼睛状态是通过计算眼睛的长宽比(eyear)来判断,如果长宽比小于某个阈值,则认为眼睛闭合,表示人处于疲劳状态。

2301_79810943的博客 2326

LLM之RAG实战(五十四)| 复杂文档处理RAG框架:Ragflow

RAGFlow 是一种结合了检索增强(Retrieval-Augmented Generation,RAG)与流程控制(Flow)的人工智能技术架构。它通过检索外部知识库中的信息,结合自然语言生成技术,为用户提供更准确、更丰富的回答。同时,它还引入了流程控制机制,能够根据任务需求动态调整信息检索和生成的流程,从而更好地完成复杂的任务。RAGFlow 的核心优势在于将检索和生成相结合,打破了传统生成模型仅依赖内部参数进行文本生成的局限。

wshzd的博客 1066

Java常见面试题 -- ConcurrentHashMap原理,jdk7和jdk8版本的区别

jdk7: 数据结构:ReentrantLock

weixin_46481307的博客 447

NXP实战笔记(五):S32K3xx基于RTD-SDK在S32DS上配置ADC的硬件触发同步采样与软件采样过程

恩智浦 S32K3xx 系列汽车微控制器器件具有 15 位分辨率逐次逼近模数转换器(SAR ADC),可用于模拟输入信号的采集和数字化。-15 位的分辨率。转换数据总是15 位宽,与所选转换分辨率无关(每转换数据 14、12、10、8 个有效位,减少这个数字会加快数据转换,因为 SAR 算法的执行步骤会更少)。-每个输入通道捕获的转换数据放在单独寄存器中。-可使用“ 平均法” 提高精度,即通过计算最高 32 次转换数据的平均数来提供最终结果。-正常转换触发转换多个。

梦想技术家 3844

ConcurrentHashMap原理,在JKD7和JDK8版本的区别

JDK7: 数据结构:ReentrantLock+Segment+HashEntry, 一个Segment中包含一个HashEntry数组,每个HashEntry又是一个链表结构 元素查询:二次hash,第一次hash定位到segment,第二次hash定位到元素所在的链表的头部 锁:Segment分段锁,Segment继承了ReentrantLock,锁定操作的Segment,其他Segment不受影响,并发度为Segment个数,可以通过构造函数指定,数组扩容不会影响其他的segment。 g

weixin_44708019的博客 157

实操微信支付,适合第一次接通微信支付的同学

我的实际操作命令如下:就会生成图3中多出来的file文件夹,/Users/camel/cert/xxxxxx_cert/file/wechatpay_5A4xxxxxxxxxx9.pem,wechatpay_xxxxx5A4849E9.pem就是微信支付平台证书,也是程序真正需要的。•注意:我的操作说明,我是把下载好的 CertificateDownloader.jar 文件,放在了解压证书的目录里(图3)。//下面的静态参数要仔细看下面的解释,否则只会调用别人写好的方法,压根学不会0-1接入微信支付。

wjianwei666的专栏 524

PCB仿真软件:Altium Designer_(18).PCB设计中的热管理

在PCB设计中,热管理是一个至关重要的环节。随着电子设备的集成度越来越高,功耗和发热量也随之增加,不合理的热设计可能导致电路板过热,从而影响电路的性能和可靠性。热管理不仅能够提高电路板的使用寿命,还能确保电路在各种环境条件下的稳定工作。本节将详细介绍如何在Altium Designer中进行有效的热管理,包括热分析、热设计和热仿真等关键步骤。

kkchenjj的博客 1984

ConcurrentHashMap原理,jdk7和jdk8版本的区别?

ConcurrentHashMap原理,jdk7和jdk8版本的区别?

weixin_43985221的博客 152

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

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

Java面试题(十二):ConcurrentHashMap原理,jdk7和jdk8版本的区别

1.ConcurrentHashMap原理,jdk7和jdk8版本的sql教程区别 jdk7: 数据结构:ReentrantLock+HashEntry,一个Segment中包含一个HashEntry数组,每个HashEntry又是一个链表结构。 元素查询:二次Hash,第一次Hash定java基础教程位到Segment,第二次Hash定位到元素所在的链表的头部。 锁:Segment分段锁Segment继承了ReentrantLock,锁定python基础教程操作的Segment,其他的Segm..

chinaherolts2008的博客 229

计算机控制技术及应用

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

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

List和Set的区别、ArrayList和LinkedList的区别、HashMap和HashTable的区别、ConcurrentHashMap原理,jdk7和jdk8版本的区别

List和Set的区别 List:有序,按对象进入的顺序保存对象,可重复,允许多个Null元素对象,可以使用Iterator取出 所有元素,在逐一遍历,还可以使用get(int index)获取指定下标的元素 Set:无序,不可重复,最多允许有一个Null元素对象,取元素时只能用Iterator接口取得所有元 素,在逐一遍历各个元素 ArrayList和LinkedList区别 ArrayList:基于动态数组,连续内存存储,适合下标访问(随机访问),扩容机制:因为数组长

Saber__Love的博客 251

深度学习工具包 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")

ConcurrentHashMap jdk7和jdk8版本的区别

ConcurrentHashMap是Java1.5中引用的一个线程安全的支持高并发的HashMap集合类。这篇文章总结了ConcurrentHashMap的内部实现原理,是对于自己理解后的一些整理。 1.HashTable与ConcurrentHashMap的对比 HashTable本身是线程安全的,写过Java程序的都知道通过加Synchronized关键字实现线程安全,这样对整

m0_37541228的博客 418

ConcurrentHashMap 的实现原理 (JDK1.7 和 JDK1.8)

HashMap、CurrentHashMap 的实现原理基本都是 BAT 面试必考内容,阿里 P8 架构师谈:深入探讨 HashMap 的底层结构、原理、扩容机制深入谈过 hashmap 的实现原理以及在 JDK 1.8 的实现区别,今天主要谈 CurrentHashMap 的实现原理,以及在 JDK1.7 和 1.8 的区别。内容目录:1. 哈希表 2.ConcurrentHashMap 与 H...

程序员世杰 3382
上一篇: JUC并发编程【狂神说java详解】,超详细。
下一篇: 使用in删除大量数据的时候注意
半鸭学长
博客等级 码龄5年 131粉丝 23原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值