java并发编程
令走天下
每天记录一点,成长自己一点
展开
-
如何正确设置线程池的线程数,提高性能
往往在生产环境中,工作线程数,设置小了,无法充分利用CPU资源,性能会下降。设置大,线程上下文切换过于频繁(可以关注一下协程,如java库提供的Quasar fiber轻量级线程、kilim以及kotlin语言支持的协程。java线程是用户线程与内核线程之间映射的,1:1模式,是通过内核完成调度的。而协程是N个内核线程多路复用M个协程的,N:M的模式,也就是在用户态的协程调度器完成的,减少了与内核之前的交互。可以很好的避免上下文切换。),反而会使性能降低.如何设置线程池的线程数首先我们先理解多线程执行的原创 2020-11-09 13:22:26 · 3358 阅读 · 0 评论 -
深入源码学习1.8的ConcurrentHashMap(二)
一、ConcurrentHashMap的使用方法实现1、get操作get方法比较简单,给定一个key来确定value的时候,必须满足两个条件 key相同 hash值相同,对于节点可能在链表或树上的情况,需要分别去查找。2、put操作put方法就是,沿用HashMap的put方法的思想,根据hash值计算这个新插入的点在table中的位置i,如果i位置是空的,直接放进去,否则进行判断,...原创 2019-05-23 14:34:18 · 160 阅读 · 0 评论 -
深入源码学习1.8的ConcurrentHashMap(一)
一、1.8的ConcurrentHashMap实现流程与1.7的不同点,改进点:改进一:取消segments字段,直接采用transient volatile HashEntry<K,V>[] table保存数据,采用table数组元素作为锁,从而实现了对缩小锁的粒度,进一步减少并发冲突的概率,并大量使用了采用了 CAS + synchronized 来保证并发安全性。改进二:...原创 2019-05-23 14:10:24 · 166 阅读 · 0 评论 -
深入源码学习1.7的ConcurrentHashMap(二)
一、ConcurrentHashMap的使用方法实现1、get操作get操作先经过一次再散列,然后使用这个散列值通过散列运算定位到Segment(使用了散列值的高位部分),再通过散列算法定位到table(使用了散列值的全部)。整个get过程,没有加锁,而是通过volatile保证get总是可以拿到最新值。segment下的HashEntry数组用了transient字段修饰,不能被反序列化。...原创 2019-05-22 17:18:12 · 123 阅读 · 0 评论 -
深入学习线程池总结(二)
一、深入源码解析线程池的方法参数1、常用的线程方法public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,BlockingQueue<Runnable> workQueue,ThreadFact...原创 2019-05-13 15:05:37 · 138 阅读 · 0 评论 -
深入学习线程池总结(一)
1、线程池的作用第一:降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。第二:提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。假设一个服务器完成一项任务所需时间为:T1 创建线程时间,T2 在线程中执行任务的时间,T3 销毁线程时间。 如果:T1 + T3 远大于 T2,则可以采用线程池,以提高服务器性能。线程池技术正是关注如何缩短或调整T1,T3时间...原创 2019-05-13 14:48:07 · 176 阅读 · 0 评论 -
深入源码学习1.7的ConcurrentHashMap(一)
一、ConcurrentHashMap的实现流程1、ConcurrentHashMap是由Segment数组结构和HashEntry数组结构组成。Segment是一种可重入锁(ReentrantLock),在ConcurrentHashMap里扮演锁的角色;HashEntry则用于存储键值对数据。一个ConcurrentHashMap里包含一个Segment数组。Segment的结构和Hash...原创 2019-05-22 14:35:21 · 156 阅读 · 0 评论 -
深入源码学习ThreadLocal之使用的导致的内存泄露和线程不安全的问题(三)
一、ThreadLocal导致的内存泄露1、根据前面的深入源码学习threadLocal(二)对ThreadLocal的分析,我们可以知道每个Thread 维护一个 ThreadLocalMap,这个映射表的 key 是 ThreadLocal实例本身,value 是真正需要存储的 Object,也就是说 ThreadLocal 本身并不存储值,它只是作为一个 key 来让线程从 ThreadL...原创 2019-05-15 15:06:53 · 406 阅读 · 0 评论 -
深入源码学习ThreadLocal(二)
一、ThreadLocal源码解析1、首先取到当前线程,然后调用getMap方法获取对应的ThreadLocalMap,ThreadLocalMap是ThreadLocal的静态内部类,然后Thread类中有一个这样类型成员,所以getMap是直接返回Thread的成员。 /** * Returns the value in the current thread's copy...原创 2019-05-14 11:35:44 · 170 阅读 · 0 评论 -
深入源码学习ThreadLocal(一)
一、ThreadLocal的作用ThreadLocal为每个线程都提供了变量的副本,使得每个线程在某一时间訪问到的并非同一个对象,这样就隔离了多个线程对数据的数据共享。而synchronized是利用锁的机制,使变量或代码块在某一时该仅仅能被一个线程访问。开发中遇到的例子:Spring的事务就借助了ThreadLocal类。Spring会从数据库连接池中获得一个数据库connection,然...原创 2019-05-14 11:07:07 · 179 阅读 · 0 评论