3、高并发编程-并发容器

1、ThreadLocal(额外部分)

package com.sunyou.p5;

import java.util.concurrent.TimeUnit;

/*
 * 其实就是一个map,
 * ThreadLocal.set(value) ——>map.put(Thread.getCurrentThread(),value);
 * TreadLocal.get() ——>map.get(Thread.getCurrentThread())
 * 注意:在并发量高的时候,可能有内存溢出,所以在使用ThreadLocal的时候
 * 一定要回收资源,每个线程结束之前,将当前线程保存的线程变量删除ThreadLocal.remove()
 */
public class ThreadLocalTest {
	volatile static String name = "张三";
	static ThreadLocal<String> tl = new ThreadLocal<>();
	public static void main(String[] args) {
		//开启两个线程,一个读取数据,一个写数据
		new Thread(new Runnable() {
			@Override
			public void run() {
				try {
					//睡眠两秒
					TimeUnit.SECONDS.sleep(2);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				System.out.println(name);//输出李四
				System.out.println(tl.get());//输出null
			}
		}).start();
		new Thread(new Runnable() {
			@Override
			public void run() {
				try {
					//睡眠一秒
					TimeUnit.SECONDS.sleep(1);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				name = "李四";
				tl.set(name);
			}
		}).start();
	}
}

ThreadLocal会为变量在每个线程中创建一个副本,线程之间的副本互不影响。ThreadLocal的应用场景为解决数据库连接、Session管理等等。推荐一篇很好的博文 深入剖析ThreadLocal

2、CuntCurrentHashMap

在并发编程中使用HashMap可能会导致程序死循环,具体原因是在rehash过程中导致链表产生了环路造成的。可以参考博文 HashMap多线程下死循环的原因

同时HashTable使用的效率非常低下,HashTable是使用sychronized来保证线程安全的,在一个线程put时,也不允许其他线程不能进行put和get。所以这个时候可以使用CountCurrentHashMap来替代它们称为多线程下的容器。

ConcurrentHashMap使用锁分段技术来保证线程安全同时提升并发访问效率。

ContCurrentHashMap是由Segment数组和HashEntry数组构成。Segment是一种重入锁,HashEntry用于存储键值对。在初始化Segment数组和HashEntry数组时,会保证数组的长度都是2的N次方。同时其hash算法采用了Wang/Jenkins hash算法对元素的hashCode进行一次再散列。

测试HashTable、ConcurrentHashMap和ConcurrentSkipListMap的效率

package com.sunyou.p5;

import java.util.Hashtable;
import java.util.Map;
import java.util.Random;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentSkipListMap;
import java.util.concurrent.CountDownLatch;

/*
 * 测试concurrentMap的效率
 */
public class ConcurrentMapTest {
	public static void main(String[] args) {
		final Map<String, String>  map = new Hashtable<>();
		//final Map<String, String> map =
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值