![](https://img-blog.csdnimg.cn/20201014180756913.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
并发编程与高并发
文章平均质量分 79
eluanshi12
这个作者很懒,什么都没留下…
展开
-
Java Map中那些巧妙的设计
一 自动扩容最小可用原则,容量超过一定阈值便自动进行扩容。扩容是通过resize方法来实现的。扩容发生在putVal方法的最后,即写入元素之后才会判断是否需要扩容操作,当自增后的size大于之前所计算好的阈值threshold,即执行resize操作。HashMap的put方法 public V put(K key, V value) { return putVal(hash(key), key, value, false, true); }static final in转载 2021-03-25 18:54:23 · 128 阅读 · 0 评论 -
美团:Java线程池实现原理 阅读笔记
多核CPU多线程并行计算,提升服务器性能J.U.C提供的线程池ThreadPoolExecutor类,帮助开发人员管理线程并方便地执行并行任务一、写在前面线程池是什么线程池(Thread Pool)是一种基于池化思想管理线程的工具,经常出现在多线程服务器中,如MySQL。(管理线程而获取并发性)池化思想:为了最大化收益并最小化风险,而将资源统一在一起管理的一种思想。Pooling is the grouping together of resources (assets, equipment原创 2021-03-04 22:37:52 · 556 阅读 · 2 评论 -
并发编程与高并发解决方案(三):死锁
互斥条件:指进程对所分配到的资源进行排它性使用,即在一段时间内某资源只由一个进程占用。如果此时还有其它进程请求资源,则请求者只能等待,直至占有资源的进程用毕释放。(没法改变)请求和保持条件:指进程已经保持至少一个资源,但又提出了新的资源请求,而该资源已被其它进程占有,此时请求进程阻塞,但又对自己已获得的其它资源保持不放。【增加一个中间层来破坏该条件】不可剥夺条件:指进程已获得的资源,在未使用完之前,不能被剥夺,只能在使用完时由自己释放。【Java 显示锁支持通知(notify/notifyall)和等待原创 2021-03-04 13:53:02 · 192 阅读 · 1 评论 -
并发编程与高并发解决方案(二):可见性volatile
可见性一个线程对主内存的修改可以及时的被其他线程观察到共享变量在线程间不可见的原因线程交叉执行重排序结合线程交叉执行共享变量更新后的值没有在工作内存与主内存间及时更新SynchronizedJMM关于其的规定 :锁可以让临界区互斥执行,让释放锁的线程向获取同一个锁的线程发送消息。加锁与解锁是同一把锁线程解锁前,必须把共享变量的最新值刷新到主内存线程加锁时,清空工作内存中共享变量的值,从而使用共享变量时需要从主内存重新读取最新值可见性-volatile通过 加入内存屏障和 禁止原创 2021-03-02 22:05:07 · 108 阅读 · 0 评论 -
高速缓存(cache)原理
高速缓存(cache) 概念和原理cache基本思想▪ cache 存储器( Cache memories )▪ 在处理器附近增加一个小容量快速存储器(cache)▪ 基于SRAM,由硬件自动管理cache基本思想:▪ 频繁访问的数据块存储在cache中▪ CPU 首先在cache中查找想访问的数据,而不是直接访问主存▪ 我们希望被访问数据存放在cache中Cache 基本概念:块(block)访问block b 不在 Cache 中,从内存中取出 block b ,将 block原创 2021-03-01 22:11:38 · 5768 阅读 · 0 评论 -
开篇:并发编程核心[分工、协作、互斥]
线程和进程图解工厂、车间、工人并发编程可抽象成三个核心问题: 分工、同步/协作、互斥学并发编程,透彻理解这三个核心是关键分工将当前 Sprint 的 Story 拆分成「合适」大小的 Task,并且安排给「合适」的 Team Member 去完成关于分工,常见的 Executor,生产者-消费者模式,Fork/Join 等,这都是分工思想的体现同步/协作任务拆分完毕;任务之间会存在依赖关系,前面的任务执行完毕,后面的任务才可以执行,人高级在可以通过沟通反复确认,确保自己的任务可以开始执行。但转载 2021-03-01 13:49:22 · 241 阅读 · 0 评论 -
线程池OOM异常
现象MACunable to creat new native threadwindow测试前 在启动测试类之前先将JVM内存调整小一点,不然很容易将电脑跑出问题在idea里:Run -> Edit Configurations VM options修改成-Xms10M -Xmx10M(-Xms10M Java Heap内存初始化值 -Xmx10M Java Heap内存最大值)Exception in thread “main” java.lang.OutOfMemoryEr原创 2020-10-23 13:29:03 · 1285 阅读 · 0 评论 -
压测线程池问题
现象描述:exception: java.util.concurrent.RejectedExecutionException:Task java.util.concurrent.FutureTask@1329962c rejected from java.util.concurrent.ThreadPoolExecutor@5a10b905[Running, pool size = 250, active threads = 250, queued tasks = 1024, completed ta原创 2020-10-23 11:25:28 · 834 阅读 · 0 评论 -
线程池(二):Executors线程池 封装
ExecutorService newSingleThreadExecutor()。newSingleThreadExecutor() { return new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>());}只使用一个线程,使用无界队列L...原创 2019-07-10 16:14:04 · 188 阅读 · 0 评论 -
并发编程与高并发解决方案:HashMap与ConcurrentHashMap
HashMap最多只允许一条记录的键为null,允许多条记录的值为null。HashMap非线程安全。如果需要满足线程安全,可以用 Collections的synchronizedMap方法使HashMap具有线程安全的能力,或者使用ConcurrentHashMap。HashMap慕课网实战·高并发探索(十):HashMap与ConcurrentHashMaphttp://www.cnbl...转载 2019-07-18 10:16:19 · 226 阅读 · 0 评论 -
并发编程与高并发解决方案(三):线程安全-原子性
多个线程访问某个类时,不管运行时环境采用何种调度方式或者这些进程将如何交替执行,并且在主调代码中不需要任何额外的同步或协同,这个类都能表现出正确的行为,那么就称这个类是线程安全的。原子性:提供了互斥访问,同一时刻只能有一个线程来对它进行操作可见性:一个线程对主内存的修改可以及时的被其他线程观察到有序性:一个线程观察其他线程中的指令执行顺序,由于指令重排序的存在,该观察结果一般杂乱无序。原...原创 2019-01-23 17:46:49 · 119 阅读 · 0 评论 -
并发编程与高并发解决方案(二):三大问题
一种规范,Java Memory Model-JMM定义了Java 虚拟机(JVM)在计算机内存(RAM)中的工作方式。1.一个线程如何和何时可以看到其他线程修改过的共享变量的值。2.如何以及何时同步的访问共享变量。堆Heap:运行时数据区,有垃圾回收。优点:运行时动态分配内存大小(生存期不必事先告诉编译器)缺点:由于运行时动态分配内存,所以存取速度慢一些栈Stack:栈的数据是可...原创 2019-01-22 17:26:38 · 182 阅读 · 0 评论 -
阻塞队列 BlockingQueue(一):7个阻塞队列简介
BlockingQueue线程安全的队列访问主要应用场景:生产者消费者模型,是线程安全的阻塞情况:当队列满了进行入队操作当队列空了的时候进行出队列操作四套方法:BlockingQueue提供了四套方法,分别来进行插入、移除、检查。每套方法在不能立刻执行时都有不同的反应。Throws Exceptions :如果不能立即执行就抛出异常。Special Value:如果不能...原创 2018-12-14 09:10:42 · 458 阅读 · 0 评论 -
阻塞队列 BlockingQueue(二):ArrayBlockingQueue与LinkedBlockingQueue源码
原文:阻塞队列 BlockingQueueArrayBlockingQueue主要参数:/** 存储数据的数组 */final Object[] items;/**获取数据的索引,主要用于take,poll,peek,remove方法 */int takeIndex;/**添加数据的索引,主要用于 put, offer, or add 方法*/int putIndex;/*...转载 2018-12-14 09:38:38 · 292 阅读 · 0 评论 -
AtomicLong 与 LongAdder(CAS机制的优化)
线程安全性-原子性-CASLongAdder是java8为我们提供的新的类,跟AtomicLong有相同的效果。是对CAS机制的优化。AtomicLong://变量声明public static AtomicLong count = new AtomicLong(0);//变量操作count.incrementAndGet();//变量取值count.get();LongAdd...转载 2018-12-07 14:29:38 · 1330 阅读 · 0 评论 -
阻塞队列BlockingQueue(三)--DelayQueue
DelayQueue支持延时获取元素的无界阻塞队列内部采用PriorityQueue与ReentrantLock实现。public class DelayQueue&lt;E extends Delayed&gt; extends AbstractQueue&lt;E&gt; implements BlockingQueue&lt;E&gt; { private trans..原创 2018-12-20 15:06:10 · 151 阅读 · 0 评论 -
并发容器J.U.C -- AQS同步组件(二):共享
CountDownLatch、Semaphore、CyclicBarrier、ReentrantLock、Condition、FutureTaskCountDownLatch**计数器向下减的闭锁 **同步阻塞类,完成阻塞当前线程的功能,给定了一个计数器,原子操作,计数器不能重置。1.通过一个计数来保证线程是否需要被阻塞。实现一个或多个线程等待其他线程执行的场景。2.程序需要等待某个条...原创 2018-12-26 14:47:20 · 190 阅读 · 0 评论 -
线程池(一):Executor原理
new Thread的弊端每次new Thread 新建对象,性能差线程缺乏统一管理,可能无限制的新建线程,相互竞争,可能占用过多的系统资源导致死机或者OOM(out of memory内存溢出)。(这种问题的原因不是因为单纯的new一个Thread,而是可能因为程序的bug或者设计上的缺陷导致不断new Thread造成的)缺少更多功能,如更多执行、定期执行、线程中断。线程池的好处...原创 2018-12-24 16:43:11 · 288 阅读 · 0 评论 -
并发容器J.U.C -- AQS同步组件(三)
https://www.jianshu.com/p/9e70e927fafchttps://blog.csdn.net/jesonjoke/article/details/80058631ReentrantLockjava中两类锁:SynchronizedJ.U.C中提供的锁。ReentrantLock与Synchronized都是可重入锁,本质上都是lock与unlock的操作。...原创 2018-12-29 16:42:34 · 263 阅读 · 0 评论 -
并发容器J.U.C -- AQS组件(一)
AQS简介AQS全名:AbstractQueuedSynchronizer,是并发容器J.U.C(java.lang.concurrent)下locks包内的一个类。它实现了一个FIFO(FirstIn、FisrtOut先进先出)的队列。底层实现的数据结构是一个双向列表。Sync queue:同步队列,是一个双向列表。包括head节点和tail节点。head节点主要用作后续的调度。Cond...原创 2018-12-26 10:56:30 · 324 阅读 · 0 评论