
并发编程
霄练
本博客为笔记博客,主要是针对个人学习工作用
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
并发流程工具Semaphore的使用
一个计数信号量。 在概念上,信号量维持一组许可证。 如果有必要,每个acquire()都会阻塞,直到许可证可用,然后才能使用它。 每个release()添加许可证,潜在地释放阻塞的线程。 记得以前校招,一个公司对应很多面试的学生,因为人数太多每次至多面试5个人,其他人只能等待,除非有人出来,等待的人才有机会进去,一般是排队公平进去,但是大家为了找工作都是抢着进去面试,大概是这么个意思。等待就是acquire(),有人出来就是release(),Semaphore底层使用AQS实现原创 2020-05-26 16:03:59 · 339 阅读 · 0 评论 -
并发流程工具CyclicBarrier
允许一组线程全部等待彼此达到共同屏障点。 循环阻塞在涉及固定大小的线程的程序中很有用,这些线程必须偶尔等待彼此。 屏障被称为循环 ,因为它可以在等待的线程被释放之后重新使用。这和CountDownLatch有明显的区别。通俗点讲就是:让一组线程到达一个屏障时被阻塞,直到最后一个线程到达屏障时,屏障才会开门,所有被屏障拦截的线程才会继续干活。原创 2020-05-20 12:19:25 · 164 阅读 · 0 评论 -
并发容器CopyOnWriteArrayList解析
ArrayList<E>是线程不安全的,在早期可以用Vector代替,或者利用Collections工具类,通过包装实现线程安全,但是这两种方方式效率低下。原创 2020-05-16 13:52:51 · 303 阅读 · 0 评论 -
线程同步工具Condition详解
Condition可以代替Object监视器方法( wait , notify和notifyAll ),必须和Lock配合使用, Lock替换synchronized方法和语句的使用, Condition取代了对象监视器方法的使用。可以使某个线程挂起,直到其他线程唤醒,就像Object.wait()方法,一个Condition实例本质上绑定到一个锁。 要获得特定Condition实例,请使用lLock的newCondition()方法。原创 2020-05-15 17:18:43 · 345 阅读 · 0 评论 -
并发流程工具CountDownLatch解析
**CountDownLatch**是一个线程并发流程工具,它允许一个或者多个线程阻塞直到一些线程执行完毕,才会继续执行,CountDownLatch会存在一个计数器,当 await方法调用,那么后面的线程都会被阻塞,直到由于countDown()方法的调用而导致当前计数达到零,后续被阻塞的线程才会继续执行,这个计数器是一次性的,不能重置,如果需要重置计数,请考虑使用**CyclicBarrier**原创 2020-05-15 13:20:46 · 242 阅读 · 0 评论 -
并发容器ConcurrentHashMap原理解析
HashMap是线程不安全的,如并发下键相同的put后面的put会覆盖前面的put,这样得到的结果会与实际不符,所以有线程安全的情况下就必须使用一些手段让HashMap变得线程安全,或者用其他线程安全的map替代,而这个安全的map就是**Hashtable**,但是其效率低下原创 2020-05-12 22:48:28 · 381 阅读 · 0 评论 -
并发编程之AtomicReference
此类属于原子并发包,可以对引用类型进行原子无锁操作原创 2020-04-26 22:06:38 · 274 阅读 · 0 评论 -
并发之原子数组
原子数组,可以对数组进行无锁原子操作,java.util.concurrent.atomic 中的类延伸了volatile,其中原子数组,可以对数组进行无锁原子操作,以AtomicIntegerArray为例子原创 2020-04-26 21:06:18 · 286 阅读 · 0 评论 -
洽谈java中的锁
锁,用来锁住某种资源的工具,来达到安全的保证.资源有贵重和价值大小之分,那么与之匹配的锁也有轻量与重量之分,杀鸡焉用牛刀,钢丝不能拉火车,什么样的资源匹配什么样的锁,不同的锁扮演不同的角色,就好像不会拿几块钱的锁去锁银行的金库.事实上我进你家的门比进银行的金库要简单得多,也方便的多.java中的锁和现实中的锁一样,不同的类型能够扮演不同的角色.原创 2020-03-25 10:01:35 · 137 阅读 · 0 评论 -
并发原子类AtomicInteger详解
原子类是对volatlie的补充,利用cas原理达到操作不可分割保证原子性,在多线程下粒度细,效率高,可以把锁定位在变量的级别,但是在高度竞争下效率不如锁。AtomicInteger可以对一个int进行原子更新AtomicInteger不能用作Integer的替代品 。但是可以利用工具对数值在多线程下的原子操作原创 2020-03-20 21:13:40 · 283 阅读 · 0 评论 -
并发编程之ReentrantLock解析
是一种可重入同步互斥锁,其行为和语义和synchronized相同,但是对其进行了延申和升级,比如支持超时获取与公平策略,能响应线程中断,能够知道是否获取到了锁,更加灵活,效率更低.公平策略会降低吞吐量,但是能有效避免线程饥饿,在争用情况下,公平策略锁倾向于授予对等待时间最长的线程的访问权,避免线程争抢某个线程一直得不到CPU使用权.Lock不会像synchronized一样,异常的时候自动释放锁,所以最佳实践是,finally中释放锁,以便保证发生异常的时候锁一定被释放原创 2020-03-19 17:06:14 · 218 阅读 · 0 评论 -
恰谈我对CAS的理解
首先CAS是一种思想和算法,它是对volatile的补充和延申,我们知道volatile只能保证可见性和禁止指令重排序,但是不能解决原子操作,最典型的就是a++操作。原创 2020-03-18 21:25:23 · 1268 阅读 · 1 评论 -
并发工具类ThreadLocal详解
一般用于每个线程需要独享的对象(通常是工具类,典型的SimpleDateFormat和Random)还有就是每个线程内需要保存全局变量(例如在拦截器中获取用户信息),可以让不同方法直接使用,避免参数传递的额麻烦能够线程安全,不需要枷锁,避免参数传递,代码耦合低...原创 2020-05-11 23:06:06 · 420 阅读 · 0 评论 -
一文彻底搞懂线程池
创建线程本身开销大,反复创建并销毁,过多的占用内存。所以有大量线程创建考虑使用线程池**。线程池不用反复创建线程达到线程的服用,更具配置合理利用cpu和内存减少了开销,性能会得到提高,还能统一管理任务比如服务器收到大量请求,每个请求都分配线程去处理,对服务器性能考验就比较大,如果创建5个以上线程考虑使用线程池。原创 2020-05-12 17:29:13 · 399 阅读 · 0 评论 -
线程安全知多少
线程是把多人剑:多线程会导致性能问题(线程引入的开销和上下文切换)原创 2020-05-12 17:29:51 · 330 阅读 · 0 评论 -
一文搞定线程的生命周期
话不多说,直奔主题,看图:线程的6个状态new:已经创建没有调用start方法启动,已经做好准备Runnable:调用start方法,可运行,即使在运行也是Runnable而不是runningBlocked:monitor被其他线程占有,也就是被synchronized修饰Waiting:一般习惯而言,把Blocked(被阻塞)、Waiting(等待)、Timed Waiting(计...原创 2020-05-12 19:49:13 · 184 阅读 · 0 评论 -
一文搞懂Thread类核心用法
简介直奔主题,从源码解析Thread的用法以及多线程的使用public class Threadextends Objectimplements Runnable// Runnable接口定public interface Runnable { public abstract void run();}//Thread重写run方法 @Override pu...原创 2020-03-12 11:41:48 · 573 阅读 · 0 评论 -
并发编程之LinkedBlockingQueue源码解析
/***基于链表节点的可选有界阻塞队列。此队列对元素FIFO(先进先出)进行排序。*队列的头是队列中出现时间最长的元素。队列的尾部是在队列中出现的时间最短的元素。*在队列的尾部插入新元素,队列检索操作在队列的头部获取元素。*与基于阵列的队列相比,链接队列通常具有更高的吞吐量,但在大多数并发应用程序中,其性能不太可预测。**如果未指定,则容量等于Integer.MAX_值。每次插入时都会...原创 2020-03-10 09:51:08 · 234 阅读 · 0 评论 -
并发编程之ArrayBlockingQueue源码解析
public class ArrayBlockingQueue<E> extends AbstractQueue<E> implements BlockingQueue<E>, java.io.Serializable/***由数组组成的有界阻塞队列。此队列对元素FIFO(先进先出)进行排序。队列的头是队列中出现时间最长的元素。队列的尾部...原创 2020-03-04 13:59:00 · 272 阅读 · 0 评论 -
并发容器之BlockingQueue源码解读
public interface BlockingQueueextends Queue阻塞队列支持在检索元素时如果队列为空发生阻塞,直到有可以操作的元素。同时在插入元素如果没有多余的容量支持,就阻塞,直到有可用空间BlockingQueue方法有四种形式,根据处理操作的方式不同,有的能立即得到结果,有的会在某个时间点获得结果:一种方法抛出异常,另一种方法返回特殊值(根据操作的不同,可以为nu...原创 2020-03-04 09:35:45 · 156 阅读 · 0 评论 -
高并发系统设计思考-----通用设计方法是什么
高并发代表着大流量,高并发系统设计的魅力就在于我们能够凭借自己的聪明才智设计巧妙的方案,从而抵抗巨大流量的冲击,带给用户更好的使用体验。这些方案好似能操纵流量,让流量更加平稳得被系统中的服务和组件处理。来做个简单的比喻吧。从古至今,长江和黄河流域水患不断,远古时期,大禹曾拓宽河道,清除淤沙让流水更加顺畅;都江堰作为史上最成功的的治水案例之一,用引流将岷江之水分流到多个支流中,以分担水流压力;三...原创 2019-12-09 18:18:46 · 470 阅读 · 0 评论 -
如何正确的停止线程
停止线程的正确方法**原理:**通过interrup通知线程,是否中断,什么时候中断由线程决定,而不是强制中断,保证安全最佳实践:如何正确停止线程1: 通常线程会在什么时候停止:run方法执行完毕或者抛出异常未捕获2: 正确的停止方法interrupta:通常线程会在什么情况下停止普通情况c: 线程可能被阻塞如果线程睡眠中,收到中断通知,会抛出异常,需要异常处理d:如果线程...原创 2020-05-12 19:49:30 · 534 阅读 · 0 评论 -
创建线程的正确姿势
简介:多线程,作为实现软件并发执行的一个重要方法,也是越来越重要。多线程可以在时间片里被cpu快速切换,所以资源能更好被调用、程序设计在某些情况下更简单、程序响应更快。本系列博客主要介绍多线程的核心知识,对多线程核心知识进行归纳总结,本博客暂时不涉及并发包和线程池的内容,希望能对阅读本博客的人有所帮助,如有不足之处欢迎留言指正原创 2020-05-12 19:49:52 · 340 阅读 · 0 评论 -
一文搞懂Synchronized
简介:对多线程可见,保证同一时刻最多只有一个线程执行代码,达到线程并发安全,被修饰的代码保证了可见性、一定程度上的原子性和禁止指令重排序。关键是独占一个锁。关键字,java原生支持,最基本的互斥同步手段。如果不使用并发手段的后果:比如两个线程同时执行a++,最后结果比预期的要少原因:a++包含三个操作不具有原子性,读取a值,a+1,然后写入内存,共分三个步骤抢占式调度引起,底层原理是jav...原创 2020-05-12 16:20:24 · 663 阅读 · 1 评论