并发编程
从入门到放弃
Sicimike
桃花影落飞神剑,碧海潮生按玉萧。
展开
-
面试必问的AQS(AbstractQueuedSynchronizer),一文全搞定
并发编程躲不掉的AQS原创 2020-06-23 21:37:21 · 3288 阅读 · 1 评论 -
你写的单例模式,能防止反序列化和反射吗?
前言说起单例模式,相信大家都不会陌生。因为相比其他设计模式,实现一个单例模式是比较简单的。单例模式的意思就是一个类只有一个实例。获取类的实例,我们往往采用new关键字,但是要保证一个类只能有一个实例,所以不能让使用这个类的开发人员利用new关键字来创建实例。也就是不能让外部调用类的构造方法,所以很容易想到类的构造方法私有,这样开发人员就不能在类之外通过new的方法创建该类的对象了。由于外部不...原创 2020-02-24 19:40:33 · 3160 阅读 · 1 评论 -
ConcurrentHashMap底层结构与实现原理
前言HashMap是一个非常优秀的类,使用也非常频繁。原创 2020-01-19 13:42:20 · 4221 阅读 · 0 评论 -
如何获取子线程的执行结果
前言博主以前面试的时候,真真切切的被问过这样一道题:如何获取子线程的执行结果?总所周知,在单线程情况下,想获取线程执行结果很简单,只需要写类似的代码即可:Object result = xxx.getXxx();但是在多线程的情况下,想要获取子线程的执行结果,恐怕就没这么简单了。剑走偏锋我们都知道开启一个新线程的方式有两种:继承Thread类、实现Runnable接口。可是这两...原创 2020-01-08 21:59:40 · 5550 阅读 · 2 评论 -
并发工具Phaser、Exchanger使用
前言Phaser是JDK1.7提供的一种同步工具,是可重用的同步屏障,其功能类似于CyclicBarrier和CountDownLatch,但支持更灵活的用法。本篇主要讲解Phaser、Exchanger两种工具的用法。其更加灵活的地方就在于:可以阶段性的控制各个线程的行为。举个例子总共六位同学要参加同学聚会,聚会流程有三项:吃饭、K歌、看电影。六位同学都要吃饭,但是吃完饭后只有四位同学想...原创 2020-01-05 14:27:28 · 3140 阅读 · 0 评论 -
一千万个数高效求和
大厂真实面试题原创 2020-01-04 11:49:01 · 4555 阅读 · 3 评论 -
Thread类、Runnable接口详解
前言Thread类想必都不陌生,第一次学习多线程的时候就一定会接触Thread类。本篇主要从Thread类的定义、使用、注意事项、源码等方面入手,全方位的讲解Thread类。Thread我们经常会被问到这样一个问题:Java开启一个新线程有哪几种方法?答案是两种:继承Thread类、实现Runnable接口。说只有两种,有人可能就不服了,实现Callable接口为什么不算?线程池为...原创 2019-12-26 23:08:02 · 6101 阅读 · 0 评论 -
深度解析延迟队列DelayQueue
前言有时候,我们有一些任务需要“稍后”来做,比如一些连接需要空闲一段时间后再关闭,session需要空闲一段时间后自动退出。这个时候就需要一些可以延迟执行任务的工具。DelayQueue(延迟队列)就是一个可以实现类似功能的工具。DelayQueueDelayQueue(延迟队列)的标准实现出现在JDK1.5中的J.U.C包中,作为一个工具类,用来管理一些需要延迟处理的任务。先来看下它的类体...原创 2019-12-23 22:41:41 · 2785 阅读 · 0 评论 -
深度解析阻塞队列ArrayBlockingQueue
前言前一篇 深度解析阻塞队列LinkedBlockingQueue 从底层源码和结构原理入手,较为深入的讲解了由单链表实现的阻塞队列LinkedBlockingQueue。本篇所要讲解的依然是阻塞队列,阻塞还是那个阻塞,队列还是那个队列。只是ArrayBlockingQueue使用数组实现的阻塞队列。由于前一篇已经重点讲解了阻塞队列中,阻塞API的实现。所以本篇的重点放在ArrayBlocki...原创 2019-12-10 22:28:10 · 2062 阅读 · 0 评论 -
深度解析阻塞队列LinkedBlockingQueue
前言关于阻塞队列的使用,其实之前的文章已经提到过:三种方式实现生产者-消费者模型,最后一种方式就是用阻塞队列实现的。仔细观察会发现,前两种也是在用wait/notify和ReentrantLock/Condition模拟阻塞队列。LinkedBlockingQueue是阻塞队列中的一种,见名知意,由链表实现的阻塞队列。...原创 2019-12-05 23:19:50 · 2181 阅读 · 0 评论 -
深度解析CopyOnWriteArrayList,线程安全的ArrayList
前言ArrayList是线程不安全的,这点毋庸置疑。因为ArrayList的所有方法既没有加锁,也没有进行额外的线程安全处理。而Vector作为线程安全版的ArrayList,存在感总是比较低。因为无论是add、remove还是get方法都加上了synchronized锁,所以效率低下。JDK1.5引入的J.U.C包中,又实现了一个线程安全版的ArrayList——CopyOnWriteArr...原创 2019-12-04 21:58:16 · 2405 阅读 · 1 评论 -
面试官:请手写一段必然死锁的代码
前言死锁(Deadlock),是并发编程中最需要考虑的问题之一,一般来说死锁发生的概率相对较小,但是危害奇大。本篇主要讲解死锁相关的内容,包括死锁形成的必要条件、危害、如何避免等等。死锁的定义死锁(英语:Deadlock),又译为死结,计算机科学名词。当两个以上的运算单元,双方都在等待对方停止运行,以获取系统资源,但是没有一方提前退出时,就称为死锁。在多任务操作系统中,操作系统为了协调不同...原创 2019-12-03 21:46:41 · 2325 阅读 · 0 评论 -
三种方式实现生产者-消费者模型
前言生产者消费者问题(英语:Producer-consumer problem),也称有限缓冲问题(英语:Bounded-buffer problem),是一个多线程同步问题的经典案例。该问题描述了两个共享固定大小缓冲区的线程——即所谓的“生产者”和“消费者”——在实际运行时会发生的问题。生产者的主要作用是生成一定量的数据放到缓冲区中,然后重复此过程。与此同时,消费者也在缓冲区消耗这些数据。该...原创 2019-11-17 11:41:28 · 4269 阅读 · 0 评论 -
如何优雅的中断线程
前言有时候我们需要中断一个线程。由于启动一个线程的方法是start(),所以终止一个线程很容易想到stop(),JDK在java.lang.Thread类中确实提供了一个stop()方法,这个方法的作用是强制停止一个线程。但是从jdk1.2开始就被标记@Deprecated废弃了,因为强制停止一个线程不管该线程是否执行完成,并且会释放该线程持有的锁,因此会产生安全问题。...原创 2019-08-22 22:15:18 · 2404 阅读 · 0 评论 -
如何交替打印奇数偶数
线程间通信,了解一下。原创 2019-08-26 23:55:07 · 3484 阅读 · 0 评论 -
ThreadLocal花十分钟就能搞定
面试必问的ThreadLocal,了解一下。原创 2019-09-02 23:01:22 · 2635 阅读 · 0 评论 -
ThreadPoolExecutor线程池实现原理与源码解析
ThreadPoolExecutor线程池原理 + 源码,了解一下。原创 2020-01-10 22:44:18 · 3031 阅读 · 0 评论 -
看完这篇volatile,面试官再也不敢问你了
关于volatile的一切,了解一下。原创 2019-09-25 22:52:24 · 2219 阅读 · 0 评论 -
synchronized关键字(一):实现原理
前言对我而言,一提到多线程并发,第一个想到的就是synchronized关键字。因为synchronized基本上就是我学习Java多线程并发时接触到的第一个关键字,也是一把神兵利器。让我们很容易的就能写出线程安全的代码,正因为用法非常简单、功能非常强大,所以基本上是初学者接触到的第一个多线程并发关键字。作用对于synchronized关键字的作用,简单来说一句话就可以概况:在同一时刻,...原创 2019-09-29 21:02:32 · 2510 阅读 · 0 评论 -
synchronized关键字(二):案例分析
线程八锁,了解一下。原创 2019-09-29 22:54:21 · 1923 阅读 · 0 评论 -
无锁编程CAS
前言CAS(Compare And Swap,比较并交换),要说CAS是无锁编程,多多少少有些“标题党”的感觉。因为CAS根据其设计思想,可以划分为乐观锁。不同于synchronized关键字,synchronized实现的是悲观锁。我第一次听说乐观锁和悲观锁的时候有点震惊:一把锁我还得知道它乐不乐观?乐不乐观?一把锁难道还有情绪?实际上乐观锁和悲观锁是基于线程并发竞争的角度来说的,悲观锁就是...原创 2019-10-02 12:13:23 · 2564 阅读 · 0 评论 -
并发工具三巨头CountDownLatch、CyclicBarrier、Semaphore使用
前言JDK1.5提供了java.util.concurrent包(J.U.C)来简化并发编程,降低程序员使用并发编程的难度。JUC包中提供了几个并发控制工具,其中就有三巨头CountDownLatch、CyclicBarrier、Semaphore。本篇主要讲解三个工具的使用,其实现原理AbstractQueuedSynchronizer之后再详细讲解。CountDownLatchCount...原创 2019-10-03 17:00:27 · 2309 阅读 · 0 评论 -
ReentrantLock功能详解
前言Java里的锁主要分为两种:Synchronized关键字和java.util.concurrent.locks.Lock接口的实现类。之前也写过几篇关于Synchronized的博客:synchronized关键字(一):实现原理。所以本篇主要讲解ReentrantLock功能使用、与Synchronized关键字的区别等等ReentrantLock废话不多说,先来看看Reentran...原创 2019-10-04 17:57:26 · 3306 阅读 · 1 评论 -
suspend/resume、wait/notify、park/unpark
如何阻塞线程、如何唤醒线程原创 2019-10-06 17:12:47 · 2588 阅读 · 2 评论 -
Java线程到底有几种状态
前言很多文章说Java线程有五种状态:NEW(新建)、RUNNABLE(就绪)、RUNNING(运行)、BLOCKED(阻塞)、DEAD(死亡),而阻塞又分为等待阻塞、同步阻塞、其它阻塞。很遗憾这种说法是错误的,这五种状态确实早期的进程状态,也就是单线程进程的状态。线程状态Java线程到底有几种状态,其实只要打开一下JDK源码,看一下java.lang.Thread类就知道了,java.l...原创 2019-08-19 23:14:06 · 5880 阅读 · 0 评论