Vector、HashTable线程不安全示例
下面这样写法是Vector线程不安全的写法:
import java.util.Vector; public class Test {
private static Vector<Integer> vector = new Vector<Integer>(); public static void main(String[] args) {
while (true) {
for (int i = 0; i < 10; i++) {
System.out.println("添加");
vector.add(i);
} Thread removeThread = new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i < vector.size(); i++) {
System.out.println("removeThread删除");
vector.remove(i);
}
}
}); Thread printThread = new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i < vector.size(); i++) {
System.out.println("printThread获取"); System.out.println((vector.get(i)));
}
}
}); removeThread.start();
printThread.start(); //不要同时产生过多的线程,否则会导致操作系统假死
while (Thread.activeCount() > 20);
}
}
}
}
尽管Vector get()、remove()、get() 方法是I同步的 但运行上面程序会出现以下错误:
java.lang.ArrayIndexOutOfBoundsException: Array index out of range: 0
at java.util.Vector.get(Vector.java:744)
at Test$2.run(Test.java:29)
at java.lang.Thread.run(Thread.java:722)
Exception in thread "Thread-14857" java.lang.ArrayIndexOutOfBoundsException: Array index out of range: 0
at java.util.Vector.get(Vector.java:744)
at Test$2.run(Test.java:29)
HashTable线程不安全写法:
import java.util.Hashtable;
import java.util.Map; public class HashmapTest { private static Map<Integer,Integer> hashtable= new Hashtable<Integer,Integer>();
public static void main(String[] args) {
while(true){
for (int i = 0; i < 10; i++) {
System.out.println("添加");
hashtable.put(i, i);
}
Thread removeThread = new Thread(new Runnable() {
@Override
public void run() {
Iterator it = hashtable.entrySet().iterator();
while (it.hasNext()) {
Map.Entry<integer integer=""> entry=(Entry<integer integer="">) it.next();
System.out.println("delete this: "+entry.getKey()+"==="+entry.getValue());
it.remove();
}
} Thread getThread = new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i < hashtable.size(); i++) {
System.out.println("getThread获取");
System.out.println((hashtable.get(i)));
}
}
});
removeThread.start();
getThread.start();
while (Thread.activeCount() > 20);
}
}
}
会出现很多null值,但不错,因为没有那个key ,但不会报错
getThread获取
null
getThread获取
null
在多线程环境中,如果不在方法调用端做额外的同步措施,使用这段仍是线程不安全的,因为如果一个线程恰好再错误的时间删除了一个元素, 导致i不在可用的话,get方法会抛出一个ArrayIndexOutOfBoundsException
import java.util.Vector; public class Test {
private static Vector<Integer> vector = new Vector<Integer>(); public static void main(String[] args) {
while (true) {
for (int i = 0; i < 10; i++) {
System.out.println("添加");
vector.add(i);
} Thread removeThread = new Thread(new Runnable() {
@Override
public void run() {
synchronized (vector) {
for (int i = 0; i < vector.size(); i++) {
System.out.println("removeThread删除");
vector.remove(i);
}
}
}
}); Thread printThread = new Thread(new Runnable() {
@Override
public void run() {
synchronized (vector) {
for (int i = 0; i < vector.size(); i++) {
System.out.println("printThread获取"); System.out.println((vector.get(i)));
}
}
}
}); removeThread.start();
printThread.start(); //不要同时产生过多的线程,否则会导致操作系统假死
while (Thread.activeCount() > 20);
}
}
}
Vector、HashTable线程不安全示例的更多相关文章
- C++并发编程 条件变量 condition_variable,线程安全队列示例
1. 背景 c++11中提供了对线程与条件变量的更好支持,对于写多线程程序方便了很多. 再看c++并发编程,记一下学习笔记. 2. c++11 提供的相关api 3.1 wait wait用于无条件等 ...
- Python自定义线程类简单示例
Python自定义线程类简单示例 这篇文章主要介绍了Python自定义线程类,结合简单实例形式分析Python线程的定义与调用相关操作技巧,需要的朋友可以参考下.具体如下: 一. 代码 # - ...
- HashMap和Hashtable 线程安全性
HashMap和Hashtable的比较是Java面试中的常见问题,用来考验程序员是否能够正确使用集合类以及是否可以随机应变使用多种思路解决问题.HashMap的工作原理.ArrayList与Vect ...
- C# 集合 — Hashtable 线程安全
基础知识重要吗?真的很重要. 就在笔者与同事聊天中突然同事提出一个问题,让笔都有点乱了手脚(有点夸张),题目是这样的: 问:Hashtable 是线程安全的吗? 答:…… (沉默中,Yes Or No ...
- vector(相对线程安全) arryList(线程不安全)
1.什么是线程安全? 如果说某个集合是线程安全的,那么我们就不用考虑并发访问这个集合?(需要定义自己百度,但是很难懂) 2.深入jvm中的线程安全的级别. a不变模式(String等基本类型) b.绝 ...
- iOS 多线程之线程锁Swift-Demo示例总结
线程锁是什么 在前面的文章中总结过多线程,总结了多线程之后,线程锁也是必须要好好总结的东西,这篇文章构思的时候可能写的东西得许多,只能挤时间一点点的慢慢的总结了,知道了线程之后要了解线程锁就得先了解一 ...
- Java中java.util.concurrent包下的4中线程池代码示例
先来看下ThreadPool的类结构 其中红色框住的是常用的接口和类(图片来自:https://blog.csdn.net/panweiwei1994/article/details/78617117 ...
- sonar——Synchronized classes Vector, Hashtable, Stack and StringBuffer should not be used
It is better to use their new unsynchronized replacements: ArrayList or LinkedList instead of Vector ...
- Vector 是线程安全的,是不是在多线程下操作Vector就可以不用加Synchronized
如标题一样,如果之前让我回答,我会说,是的,在多线程的环境下操作Vector,不需要加Synchronized. 但是我今天无意间看到一篇文章,我才发现我之前的想法是错误的,这篇文章的地址: http ...
随机推荐
- LeetCode_9. Palindrome Number
9. Palindrome Number Easy Determine whether an integer is a palindrome. An integer is a palindrome w ...
- delphi7 clientdataset 详解
delphi Midas SQLServer的自增字段的处理1.新增时,表中有自增字段,但是不希望用Refresh,直接ApplyUpdates直接看见自增字段的值在DataSetProvider.A ...
- gitlab配置webhook报错解决
https://blog.csdn.net/xukangkang1hao/article/details/80756085 gitlab使用webhook向jenkins发送请求,报错 Request ...
- Vue学习笔记(三)组件间如何通信传递参数
一:父组件向子组件传递参数 <template > <div id="app"> <h1 v-text="title">&l ...
- Android之view的工作原理2
学习内容 View的底层工作原理,比如View的测量流程.布局流程以及绘制流程:以及常见的View回调方法:熟悉掌握前面的知识后,自定义View的时候也会更加的得心应手. 4.1 初识ViewRoot ...
- golang web框架设计4:日志设计
beego的日志设计思路来自于seelog,根据不同的level来记录日志,beego设计的日志是一个轻量级的,采用系统log.Logger接口,默认输出到os.Stdout,用户可以实现这个接口然后 ...
- Linux学习笔记:vim
目录 模式 命令模式 编辑模式 底行模式 .vimrc .viminfo .swap 本文更新于2019-09-05. 说明:下文中,使用{}引起表示自定义变量,根据实际情况填写.使用[]引起表示内容 ...
- centOS7下的静态Ip的配置。
centOS7下NAT的静态网卡的配置 最近在cenOS7下搭建大数据,发现centOS7配置静态ip的必要性.这篇博文就来谈谈如何VM虚拟机中配置centOS7的静态ip.如有不足,还望志同道合者纠 ...
- nrpe command
1. nrpe 连接问题: 报错:/usr/local/nagios/libexec/check_nrpe -H destip ; CHECK_NRPE: Error - Could no ...
- leetcode mysql
给定一个 salary 表,如下所示,有 m = 男性 和 f = 女性 的值.交换所有的 f 和 m 值(例如,将所有 f 值更改为 m,反之亦然).要求只使用一个更新(Update)语句,并且没有 ...