2.8.3 并发下诡异的HashMap
package 第二章.并发下诡异的HashMap; import org.junit.Test; import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.atomic.AtomicInteger; /**
* Created by zzq on 2018/1/19.
*/
public class HashMapMultiThread {
static HashMap<String, String> map = new HashMap<String, String>();
static AtomicInteger integer=new AtomicInteger(0);
public static class AddThread extends Thread {
int start = 0; public AddThread(int start) {
this.start = start;
} @Override
public void run() {
for (int i = start; i < 100000; i += 2) {
String put = map.put(Integer.toString(i), Integer.toString(i));
// System.out.println(map.size());
}
}
}
public static void main(String args[]) throws InterruptedException {
Thread thread1 = new Thread(new HashMapMultiThread.AddThread(0));
Thread thread2 = new Thread(new HashMapMultiThread.AddThread(1));
thread1.start();
thread2.start();
thread1.join();
thread2.join();
thread2.join();
thread2.join();
int a=0;
for (String i:map.keySet()){
if(!i.equals(map.get(i))){
// System.out.println(i);
a++;
}
}
System.out.println(map.size());
System.out.println(a);
}
@Test
public void aaa(){
System.out.println(8 & 32);
}
}
1.实例中我们可以看出1.8为例:(2个线程得到的size 不一定是2个线程数量之和) 每次添加之前,会执行 int i = indexFor(hash, table.length); 获取table的下标值,
而 indexFor这个方法中(下面为源码) static int indexFor(int h, int length) {
// assert Integer.bitCount(length) == 1 : "length must be a non-zero power of 2";
return h & (length-1);
}
这个函数返回一个值, 作为table的下标 Entry<K,V>[] table = (Entry<K,V>[]) EMPTY_TABLE; 并发说明:由于在某一时刻2个线程获取的下标值相同,那么就会造成以上情况。 2.如果jdk使用1.7的情况下,那么程序会造成死锁,死锁的原因,请看下面的分析: 假如有两个线程P1、P2,以及链表 a=》b=》null
1、P1先执行,执行完"Entry<K,V> next = e.next;"代码后发生阻塞,或者其他情况不再执行下去,此时e=a,next=b 2、而P2已经执行完整段代码,于是当前的新链表newTable[i]为b=》a=》null 3、P1又继续执行"Entry<K,V> next = e.next;"之后的代码,则执行完"e=next;"后,newTable[i]为a《=》b,则造成回路,while(e!=null)一直死循环
2.8.3 并发下诡异的HashMap的更多相关文章
- 2 java并行基础
我们认真研究如何才能构建一个正确.健壮并且高效的并行系统. 进程与线程 进程(Process):是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础 ...
- JVM常用指标查询
一.what‘s going on in Java Application 当系统卡顿,应用莫名被杀掉,我们应该怎么排查?在我已知的系统挂掉的情况,只经历过两种:1.内存申请不了(OOM):2.CPU ...
- 第2章 Java并行程序基础(三)
2.8 程序中的幽灵:隐蔽的错误 2.8.1 无提示的错误案例 以求两个整数的平均值为例.请看下面代码: int v1 = 1073741827; int v2 = 1431655768; Syste ...
- Java并发程序设计(二)Java并行程序基础
Java并行程序基础 一.线程的生命周期 其中blocked和waiting的区别: 作者:赵老师链接:https://www.zhihu.com/question/27654579/answer/1 ...
- HhashMap HashTable ConcurrentHashMap
hashMap hashTable concurrentHashMap hashMap的效率高于hashTable,hashMap是线程不安全的,并发时hashMap put方法容易引起死循环,导致c ...
- HashMap在并发下可能出现的问题分析
我们都知道,HashMap在并发环境下使用可能出现问题,但是具体表现,以及为什么出现并发问题,可能并不是所有人都了解,这篇文章记录一下HashMap在多线程环境下可能出现的问题以及如何避免. 在分析H ...
- java基础解析系列(五)---HashMap并发下的问题以及HashTable和CurrentHashMap的区别
java基础解析系列(五)---HashMap并发下的问题以及HashTable和CurrentHashMap的区别 目录 java基础解析系列(一)---String.StringBuffer.St ...
- JDK1.7 ConcurrentHashMap--解决高并发下的HashMap使用问题
高并发下也可以使用HashTable .Collections.synchronizedMap因为他们是线程安全的,但是却牺牲了性能,无论是读操作.写操作都是给整个集合加锁,导致同一时间内其他操作均为 ...
- JDK1.7 高并发下的HashMap
HashMap的容量是有限的.当经过多次元素插入,使得HashMap达到一定饱和度时,Key映射位置发生冲突的几率会逐渐提高. 这时候,HashMap需要扩展它的长度,也就是进行Resize. 影响发 ...
随机推荐
- FastAdmin 将 PHP 框架升级到 ThinkPHP 5.1
FastAdmin 将 PHP 框架升级到 ThinkPHP 5.1 社区经常有人问什么时候升级到 ThinkPHP 5.1,但是 ThinkPHP 5.1 和 ThinkPHP 5.0 差别非常大, ...
- 双击 cui
//改变属性块的双击事件 //将菜单文件中的双击改一下,退出时还原文件 acad.bak.cui 改这个名字 每次用这个更新为新的 acad.cui进行修改 //退出时再用 acad.bak.cui还 ...
- eclipse 中xml文件的字体改不了
XML Editor的改不了. 修改colors & fonts里的eclipse中打开window->prefece->generation-basic 下 Text Edito ...
- 项目中使用的图片上传方法,base64存本地
//生成健康报告 public function uploadJkbg(Request $r) { $data = $r->all(); $jkbg['jkbg_ctime'] = time() ...
- his移植问题
报错信息 权限不够未截图 注意修改uploads文件权限chmod 777 uploads 修改域名 参照dxtzy项目,sourcetree备注
- FPGA论剑
今天走在街上,听到了久违的<光辉岁月>,想起6月30号那天,街边所有的餐厅.小店都在播放beyond的经典之作,那天是香港殿堂级乐队beyond乐队主唱兼吉他手黄家驹先生的忌日.黄家驹先生 ...
- Linux_LVM Couldn't find device with uuid
Linux LVM commands result in Couldn't find device with uuid Couldn't find all physical volumes for v ...
- npm笔记和bower
生成package.json文件的方式就是dos下进入该文件夹,然后执行 npm init Bower简单点儿说就是通过nodejs直接下载GitHub上的js源码 首先你得有node,这里就不多做介 ...
- distinct与order by
不知为啥,当我得查询中出现distinct时,order by 中必须包含要查询的列,否则报错. SELECT DISTINCT a.DetailId, a.OrderId, a.ProductId, ...
- java代码用户界面网格布局GridLayout.划分为格子区域
总结:网格布局.很简单,首先要new一个 this.setlayout(new GriedLayout(3,5));里面是行数和列数 package clientFrame; //网格布局练习 i ...