ConcurrentHashMap的源码分析-initTable

数组初始化方法,这个方法比较简单,就是初始化一个合适大小的数组

sizeCtl这个要单独说一下,如果没搞懂这个属性的意义,可能会被搞晕

这个标志是在Node数组初始化或者扩容的时候的一个控制位标识,负数代表正在进行初始化或者扩容操作

-1 代表正在初始化

-N 代表有N-1有二个线程正在进行扩容操作,这里不是简单的理解成n个线程,sizeCtl就是-N,这块后续在讲扩容的时候会说明0标识Node数组还没有被初始化,正数代表初始化或者下一次扩容的大小

private final Node<K,V>[] initTable() { 
	Node<K,V>[] tab; int sc; 
	while ((tab = table) == null || tab.length == 0) { 
		if ((sc = sizeCtl) < 0)//被其他线程抢占了初始化的操作,则直接让出自己的CPU时间片 
		Thread.yield(); // lost initialization race; just spin 
		//通过cas操作,将sizeCtl替换为-1,标识当前线程抢占到了初始化资格 
		else if (U.compareAndSwapInt(this, SIZECTL, sc, -1)) { 
			try { 
			if ((tab = table) == null || tab.length == 0) { 
				int n = (sc > 0) ? sc : DEFAULT_CAPACITY;//默认初始容量为16 
				@SuppressWarnings("unchecked") 
				//初始化数组,长度为16,或者初始化在构造ConcurrentHashMap的时候传入的长度 
				Node<K,V>[] nt = (Node<K,V>[])new Node<?,?>[n]; 
				table = tab = nt;//将这个数组赋值给table 
				sc = n - (n >>> 2); //计算下次扩容的大小,实际就是当前容量的0.75倍,这里使用了右移来计算 
				} 
			} finally { 
				sizeCtl = sc; //设置sizeCtl为sc, 如果默认是16的话,那么这个时候
				sc=16*0.75=12 
			} 
			break;
		 } 
	} 
	return tab; 
} 

 

ConcurrentHashMap是Java中的一个并发容器,用于在多线程环境中安全地存储和访问键值对。它使用了一些特殊的技术来提高其并发性能。 ConcurrentHashMap源码分析可以从几个关键点开始。首先,它使用了大量的CAS(Compare and Swap)操作来代替传统的重量级锁操作,从而提高了并发性能。只有在节点实际变动的过程中才会进行加锁操作,这样可以减少对整个容器的锁竞争。 其次,ConcurrentHashMap的数据结构是由多个Segment组成的,每个Segment又包含多个HashEntry。这样的设计使得在多线程环境下,不同的线程可以同时对不同的Segment进行操作,从而提高了并发性能。每个Segment都相当于一个独立的HashMap,有自己的锁来保证线程安全。 在JDK1.7版本中,ConcurrentHashMap采用了分段锁的设计,即每个Segment都有自己的锁。这样的设计可以在多线程环境下提供更好的并发性能,因为不同的线程可以同时对不同的Segment进行读写操作,从而减少了锁竞争。 总的来说,ConcurrentHashMap通过使用CAS操作、分段锁以及特定的数据结构来实现线程安全的并发访问。这使得它成为在多线程环境中高效地存储和访问键值对的选择。123 #### 引用[.reference_title] - *1* [ConcurrentHashMap 源码解析](https://blog.csdn.net/Vampirelzl/article/details/126548972)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}} ] [.reference_item] - *2* *3* [ConcurrentHashMap源码分析](https://blog.csdn.net/java123456111/article/details/124883950)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值