Hashtable 的并发异常行为

ConcurrentHashMap 和 Hashtable 的区别 选择而非Hashtable主要是因为前者提供了更好的并发支持和性能优势,特别是在高并发读写场景下。除非你需要向后兼容老版本的代码或者对Hashtable有特别的需求,否则建议优先考虑使用。此外,随着 Java 版本的发展,Hashtable已逐渐被边缘化,更多的新功能和改进都集中在上。 阅读详情

问题

与 HashMap 相比,Hashtable 被描述为线程安全的 键-值 存储集合,似乎可以放心地应用于多线程的环境,阅读 JDK 中 Hashtable 的源码可以看到,它通过在操作方法上面添加 synchronized 关键字实现线程安全,但是,其仍然有可能发生并发异常(throw new ConcurrentModificationException()),错误发生的场景:使用了迭代器,下面的代码可以模拟出这种异常:

public static void main(String[] args) throws InterruptedException {
//        final Map map = new java.util.HashMap();
        final Map map = new java.util.Hashtable();
//        final Map map = new java.util.concurrent.ConcurrentHashMap();
        for (int i = 0; i < 10; i++) {
            map.put(i + "", i);
        }
        new Thread(new Runnable() {
            @Override
            public void run() {
                for (int i = 0; i < 10; i++) {
                    try {
                        Thread.sleep(100);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    map.put("new" + i, "");
                }
            }
        }).start();
        Set set = map.entrySet();
        for (Object o : set) {
            System.out.println(o);
            Thread.sleep(100);
        }
    }

其实查看 jdk 源码已经详细说明,迭代操作中存在并发异常问题件。


解决方案

Hashtable 是JDK1.0 就有的数据结构类,显然是有些古老了,如果需要应用在多线程的环境下,一个非常简单的解决方案,请使用 ConcurrentHashMap,幸运的是它和 Hashtable 都是 Map 接口的实现,替换实现类,保持不变的对外接口(Java 多态的功劳)。
ConcurrentHashMap 通过分段加锁的机制,提高了性能且支持并发!多线程并发,十分推荐使用!

该文源于一个问题的解决,将修复经验总结一下,希望同仁 谨慎编程,避免入坑。

HashMap和HashTable的区别?但是如果想线程安全有想效率高? 立即下载

相关推荐

Labview数据存储与读取——TDMS文件的创建与写入

Labview数据存储与读取——TDMS文件的创建与写入 你好,这是我在自学Labview编写软件过程中使用的一些功能。我在存储采集卡数据时,通过阅读大量他人的程序,发现TDM及TDMS文件十分适合波形数据的记录,TDMS文件比TDM文件在存储动态类型数据时读写速度更快,而且TDMS 文件没有容量限制,适合存储数据量庞大的测试数据。 前言少叙,书归正传 这一篇博客,说明一下如何使用基本的TDMS功能实现数据文件的存储。 所需要的控件如上图所示,在程序框图——编程——文件I\O——TDMS 中,写入TDMS

滑板小帅程序开发 2万+

Java学习路程之Hashtable和异常处理

一.Hashtable 1.集合 ArrayList 查询快,增删慢 LinkedList 查询慢,增删快 HashSet 去重(重写Hashcode和Equals方法) TreeSet 排序(实现Comparator或Comparable接口) LinkedHashSet 去重,有存取顺序 双列集合Map 线程不安全 HashMap 去重 T...

liaodongdong&blog 429

python毕设 基于Web的中药材信息查询系统程序+论文

***(程序+源码+数据库+调试部署+开发环境)论文文档1,文末可获取,系统界面在最后面。****

m0_74825541的博客 1257

java hashtable多线程操作遍历问题

最近发现程序经常报出java.util.ConcurrentModificationException异常.发现其一个互斥作用的hashtable线程周期性去除无用key报错,导致hashtable值不断增大.   检测线程为单独线程,每一小时检测一次,使用java的iterator进行遍历.问题就出在iterator.在使用iterator遍历时不能使用原hashtable的put与re...

luoyahu 356

保姆级教程:用STM32CubeMX HAL库搞定ESP8266连接,附串口printf调试全流程

本文提供了一份详细的STM32CubeMX HAL库教程,指导开发者如何实现ESP8266无线模块的连接与调试。从开发环境搭建、串口配置到AT指令通信解析,涵盖了物联网开发中的关键步骤和常见问题解决方案,帮助开发者快速掌握STM32与ESP8266的集成技术。

weixin_28273593的博客 504

TortoiseGit之配置密钥

基于github的开发必须要用到rsa密钥,因此需要用到TortoiseGit的putty key generator工具,来生成既适用于github的rsa密钥也适用于TortoiseGit的ppk密钥。

欧文的博客 2082

Hashtable和ConcurrentHashMap是如何保证线程安全的

HashMap在多线程环境下存在线程安全问题,所以会采取以下方式来代替HashMap 1. 使用Collections.synchronizedMap(Map)创建线程安全的map集合; 2.Hashtable 3.ConcurrentHashMap 一、Collections.synchronizedMap(Map)是如何实现线程安全的 先来看一下synchronizedMap(Map)的源码 ...

qq_45036591的博客 1689

weblogic启动异常故障处理(boot认证失败)

root 用户生成的文件属主为 root,WebLogic进程将无权读取,直接导致认证失败。· ⚠️ 密码必须完全一致:第3步 AdminAccount 命令中设置的密码,与第5步所有 boot.properties 文件中 password= 字段的值,必须保证完全一致。如果您的域下配置了受管服务器实例(如 ms_server1、ms_server2 等),必须逐一更新各实例下的免密启动文件,确保实例重启时密码与AdminServer保持一致,否则实例启动会因认证失败而报错。此步骤至关重要,必须执行。

weixin_53389944的博客 222

Hashtable 删除元素, 抛出异常 java.util.ConcurrentModificationException

今天在对一个Hashtable对象进行 搜索 -> 删除 操作时遇到的一个问题,开始的使用我使用的是Hashtable的Iterator,然后直接执行: Hashtable.remove(key); 抛出异常java.util.ConcurrentModificationException 查了一下java api doc,相关介绍如下: 由迭代器返回的 Iterato...

weixin_30374009的博客 221

反应动力学仿真软件:Kintecus_(4).用户界面及操作指南

在 Kintecus 中,反应方程的定义非常灵活。您可以定义简单的一阶反应、复杂的多步反应以及不同类型的反应机制。

kkchenjj的博客 1183

STM32CubeMX之DAC产成正弦波

“在之前的文章中曾经介绍过用TIM产生PWM做DAC用,STM32定时器输出PWM做DAC。部分型号的STM32单片机内部有专用的DAC,本篇文章将介绍如何用内部DAC+DMA产生正弦波...

zhang062061的专栏 1513

hashTable和多线程问题

  刚刚被一同事叫去看一个问题,问题的表象是程序会周期性的报“集合被修改,循环无法继续”的异常,查了半天的问题,最后找到问题如下: 因为本地缓存很少过期,所以我们就将本地的缓存全部放入hashtable中,而hashtable中的value一般情况下就是IList<T>类型,而hashtable中的数据也不是一定不过期,所以我们就增加了缓存的更新功能,好了,问题出现了。 ...

weixin_33969116的博客 165

OpenClaw实战-行政与HR必备:AI驱动的办公自动化

智能会议纪要自动生成会议时间智能协调自动提醒和跟进简历智能筛选和匹配度分析面试安排自动化入职办理流程化通知公告一键发布发票识别和报销辅助资产管理数字化让AI处理繁杂的事务性工作,让您有更多时间专注于更有价值的战略和管理任务。

gaoxiang_120的专栏 220

为什么HashTable慢? 它的并发度是什么? 那么ConcurrentHashMap并发度是什么?

Hashtable性能慢的原因在于全局锁、低并发性和扩容时的性能开销。通过引入分段锁和更细粒度的锁机制提高了并发性能,其默认并发度是 16,能够显著改善多线程环境下的执行效率。如果您有更多问题或者需要进一步的探讨,请随时问我!

java永无止境! 543

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

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

java hashtable 并发,Java中HashTable和ConcurrentHashMap之间的区别

并发Hashmap是在jdk1.5中引入的类。并发哈希映射仅在添加或更新映射时在称为片段的存储桶级别应用锁。因此,并发哈希映射允许对映射进行并发读写操作。HashTable是在Jdk1.1中引入的线程安全的旧类。它是Map接口的基本实现。它不允许使用null键和值。它本质上是同步的,因此两个不同的线程无法同时访问。Hashtable不维护任何顺序。序号键哈希表并发哈希映射1个基本的并发Hashma...

weixin_30062621的博客 205

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

遍历HashTable

<br />HashTable遍历与数组类似,都可以使用foreach语句。这里需要注意的是,由于HASHTABLE中的元素是一个键值对,因此需要使用DICTIONARYENTRY类型来进行遍历。DICTIONARYENTRY类型表示已个键值对的集合<br /> <br />            Hashtable hashtable = new Hashtable();<br />            hashtable.Add("钻石蓝", "DiamondBlue.ssk");<br />    

德仔 1640

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

【Java并发编程核心剖析】:HashMap与Hashtable的9大区别及性能对比

深入解析Java并发编程中HashMap与Hashtable区别,涵盖线程安全、性能对比、适用场景及核心方法差异。了解何时用ConcurrentHashMap替代Hashtable,提升并发效率,值得收藏。

InitFlow的博客 750

为什么 ConcurrentHashMap 比 Hashtable 效率高

最大限度地减少了线程间的竞争,允许更多的操作(尤其是读操作和操作不同桶/段的写操作)真正并行执行。ConcurrentHashMap 比 Hashtable 效率高主要是因为它们在实现线程安全时采用了。单一的全局锁导致所有同步操作都必须串行化,在高并发环境下成为严重的性能瓶颈。,是现代 Java 并发编程中替代。的首选线程安全 Map 实现。

牛马baby的博客 874

Java开发者必须掌握的7个并发容器知识点:从HashMap到Hashtable

掌握Java并发编程关键要点,深入解析Java并发HashMap与Hashtable区别。涵盖线程安全机制、读写效率对比及适用场景,介绍ConcurrentHashMap等常用并发容器的核心方法与优势。提升多线程开发效率,值得收藏。

FuncFun的博客 797

ConcurrentHashMap和HashTable

Hashtable和Hashtable虽然都能提供线程安全的哈希表实现,但它们在性能、设计理念和适用场景上有显著的不同。Hashtable的单一锁机制适合简单的低并发场景,而通过细粒度锁和无锁读操作提供了更高的并发性能,非常适合高并发环境下的大量数据访问操作。在现代 Java 开发中,已经成为多线程环境下哈希表的首选,而Hashtable更多的是出现在遗留代码或对性能要求不高的场景中。

Flying_Fish_roe的博客 1050

HashMap和Hashtable ConcurrentHashMap 和 HashTable

HashMap和HashtableHashMap是 JDK 1.2 引入的现代实现,牺牲线程安全换取高性能,支持null值,适合单线程场景。Hashtable是 JDK 1.0 的古老实现,通过全表加锁保证线程安全,性能低下且不支持null,已被替代。实际开发中,HashMap是默认选择;多线程场景推荐,而非Hashtable。

2502_92141759的博客 746

Java并发-ConcurrentHashMap 和 Hashtable 区别

都是 Java 中用于实现线程安全的哈希表的数据结构,但它们在实现方式、性能和使用场景上有显著的区别。下面我们将详细比较它们,并通过示例和图示来说明它们的区别。如果有进一步的问题,欢迎继续讨论-from deepseek。希望这些示例和图示能帮助你更好地理解。

weixin_42932609的博客 393

java hashtable 并发_并发工具类Hashtable

在多线程中如果需要用到集合则不能使用HashMap,Arrlist等集合,在多线程的操作中容易出现错误。因此java为我们提供了几个并发工具类包括Hashtable,concurrentHashMap,CountDownLatch和Semaphore首先是HashTableHashtable采用悲观锁SYNchronized的形式保证数据的安全性只要有线程访问,会将整张表全部锁起来,所以Hasht...

weixin_29095587的博客 302

HashTable详细介绍

HashtableHashtable通过在方法级别使用关键字实现了线程安全性,确保了在多线程环境下对哈希表的操作是安全的。然而,这种方法级同步机制带来了性能瓶颈,尤其是在高并发场景下,整体锁定的问题严重影响了并发性能。随着和其他并发集合类的引入,Hashtable已经逐渐被这些更高效、更灵活的工具所取代。尽管如此,理解Hashtable的工作原理和其在 Java 并发编程中的历史作用,对于全面掌握 Java 并发编程仍然是非常有价值的。在现代 Java 开发中,如果需要使用线程安全的集合,通常是比。

Flying_Fish_roe的博客 1055

Hash、HASHTABLE底层原理【Redis对象篇】

Hash、HASTABLE【Redis对象篇】

席万里的博客 1525

Java集合类面试必问(HashMap vs Hashtable 并发机制深度解析)

深入解析Java并发中HashMap与Hashtable区别,掌握线程安全实现原理及适用场景。对比核心方法性能,揭示ConcurrentHashMap优势,解决多线程环境下的数据一致性问题,面试必备知识点,值得收藏。

LiteCompile的博客 1031
上一篇: 线程按次序执行队列任务
conquer0715
博客等级 码龄18年 73粉丝 147原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值