当前位置: 首页 > news >正文

java hashtable线程安全_基础才是重中之重~线程安全的Hashtable

线程安全就是多线程访问时(WEB网页多用户访问一个页面时),采用了加锁机制,当一个线程访问该类的某个数据时,进行保护,其他线程不能进行访问直到该线程读取完,其他线程才可使用。不会出现数据不一致或者数据污染。

Hashtable 表示键/值对的集合,这些键/值对根据键的哈希代码进行组织,它的Key不能为null,Value可以为null,这一点与Hashmap不同(本身不是线程安全的),对于Hashtable它是实现了IDictionary和ICollection接口的,它的key与value都是object类型的,不支持泛型,进行类型转换成需要装箱与拆箱(boxing,unboxing),这在性能肯定会有一些影响,所以,微软这边给出了支持泛型的键值对集合Dictionary,而Dictionary本身也不是线程安全的,我们需要对它加锁(lock),才能避免多线程环境下产生的一些错误。

下面我们来看一下线程安全的Hashtable代码片断:

Hashtable ht = Hashtable.Synchronized(newHashtable());

ht.Add("ok", null);

Console.WriteLine(ht["ok"]);

我们在来看一下Dictionary对象,可以使它基类提供的SyncRoot属性,来实现它内部对象的线程安全

Dictionary dic = new Dictionary();lock ((dic asICollection).SyncRoot)

{

dic.Add("ok", "ok value");

}

下面我们来做一个实例,还是Dictionary的线程安全问题,我们有两个线程,t1和t2,当我们为它加lock之后,t1纯种在进行dic.Ad操作时,t2并不能进行访问

当t1完成add操作后,t2线程才进行执行,这时它就可以改变dic 元素的值了,程序运行正常,但如果没有lock锁机制,t1与 t2线程谁先执行就不确定了,这时,

如果t1先执行,当然没有问题,但如果t2先操作了,程序出现异常,因为dic元素没有被add,所以无法改变其值。

看代码:

Dictionary dic = new Dictionary();

Thread t1= new Thread(() =>{lock ((dic as ICollection).SyncRoot) //dic对象被保存,处于临界区

{

dic.Add("ok1", "ok value1");//这句先向字典添加

}

});

Thread t2= new Thread(() =>{lock ((dic asICollection).SyncRoot)

{

dic["ok1"] = "ok value2";

}

});

t1.Start();

t2.Start();

Thread.Sleep(2000);

而对于Hashtable来说,如果希望对它进行写加锁,读不加锁,也可以通过lock在代码段时去实现

Thread t1 = new Thread(() =>{lock(ht.SyncRoot)

{

ht.Add(i, i);

}

});

OK,对于hashtable的线程安全这块就说到这里,最后和大家说一下,咱们做WEB开发的工程师们,一定要注意线程安全这块的知识,因为你写的程序,肯定是处

于多线程环境下的,呵呵。

相关文章:

  • java poi excel 图表_Java使用POI解析Excel表格
  • java xml 查询_JAVA操作XML的完整例子(查询、增加、修改、删除)
  • labview和python脚本_通过python节点将字典从LabVIEW传递到python脚本
  • mysql克隆master_MySQL复制(二)Master-Slave复制实践
  • java map 平均值_使用Java 8获取两个HashMap的平均值
  • python中给出一个不超过10的正整数n_大学python题 求大佬解答!!!
  • docker建多个mysql_在Linux下使用Docker-compose建立多个数据库
  • 平安科技java在线考试_都有哪些开源的在线考试系统?
  • java clone性能比较_Java深度拷贝方式和性能对比
  • 老黄历java_基于聚合数据的老黄历接口调用示例-JAVA版
  • java properties api_【001】java中配置文件properties的操作
  • java 获取代码line_linedemo.java
  • java spring 加载顺序_java编程之如何控制springboot中bean的加载顺序
  • java注册用户信息_界面设计之注册用户信息
  • java 解析der文件_[Java]读取文件方法大全
  • [ 一起学React系列 -- 8 ] React中的文件上传
  • 《网管员必读——网络组建》(第2版)电子课件下载
  • 03Go 类型总结
  • Angular 响应式表单 基础例子
  • docker-consul
  • FastReport在线报表设计器工作原理
  • IOS评论框不贴底(ios12新bug)
  • JAVA_NIO系列——Channel和Buffer详解
  • Java知识点总结(JDBC-连接步骤及CRUD)
  • Linux编程学习笔记 | Linux多线程学习[2] - 线程的同步
  • nginx(二):进阶配置介绍--rewrite用法,压缩,https虚拟主机等
  • PAT A1120
  • react-core-image-upload 一款轻量级图片上传裁剪插件
  • Redis字符串类型内部编码剖析
  • SpringBoot几种定时任务的实现方式
  • thinkphp5.1 easywechat4 微信第三方开放平台
  • 翻译 | 老司机带你秒懂内存管理 - 第一部(共三部)
  • 悄悄地说一个bug
  • 使用common-codec进行md5加密
  • 我感觉这是史上最牛的防sql注入方法类
  • 一些基于React、Vue、Node.js、MongoDB技术栈的实践项目
  • 京东物流联手山西图灵打造智能供应链,让阅读更有趣 ...
  • #DBA杂记1
  • #include<初见C语言之指针(5)>
  • #WEB前端(HTML属性)
  • (01)ORB-SLAM2源码无死角解析-(56) 闭环线程→计算Sim3:理论推导(1)求解s,t
  • (八)Spring源码解析:Spring MVC
  • (论文阅读30/100)Convolutional Pose Machines
  • (免费领源码)python+django+mysql线上兼职平台系统83320-计算机毕业设计项目选题推荐
  • (原创)可支持最大高度的NestedScrollView
  • (转)使用VMware vSphere标准交换机设置网络连接
  • (转载)利用webkit抓取动态网页和链接
  • .apk文件,IIS不支持下载解决
  • .Net CoreRabbitMQ消息存储可靠机制
  • .NET Core日志内容详解,详解不同日志级别的区别和有关日志记录的实用工具和第三方库详解与示例
  • .NET/C# 的字符串暂存池
  • .NET3.5下用Lambda简化跨线程访问窗体控件,避免繁复的delegate,Invoke(转)
  • ?
  • [ vulhub漏洞复现篇 ] Celery <4.0 Redis未授权访问+Pickle反序列化利用
  • [BZOJ5250][九省联考2018]秘密袭击(DP)