Java多线程系列
愚公要移山
这个作者很懒,什么都没留下…
展开
-
volatile如何保证有序性?内存屏障都不知道怎么拿offer呀
在多线程的世界里,一共有三个问题:原子性问题、可见性问题、有序性问题。整个java并发体系也是围绕着如何解决这三个问题来设计的。volatile关键字也不例外,我们都知道它解决了可见性和有序性,但是不能保证原子性。这篇文章也主要基于其中一个特性,也就是研究一下volatile是如何保证有序性的。一、有序性1、有序性案例有序性指的是:程序执行的顺序按照代码的先后顺序执行。我们可以先看一个被列举了一万次的代码:int i = 0; boolean flag = false;原创 2020-05-10 14:20:45 · 12320 阅读 · 0 评论 -
CopyOnWriteArrayList,一个面试中经常问到的冷门容器
话说这个容器都说比较冷门,我自己也确实是没用过,但是在看各种面经的时候却经常见到。因此这篇文章适合正载找工作的你。最近把名称改了,由java的架构师技术栈,改为了愚公要移山。觉得自己并不聪明,但是勤奋和努力还是少不了的。因此愚公适合自己。OK。开始今天的文章。一、简介1、ArrayList非线程安全的缺陷说到这个容器,从名字就可以看出,不得不说另外一个容器,也就是ArrayList。ArrayList是非线程安全的,也就是说在多个线程下进行读写,会出现异常。先举一个简单地例子,看看会出现什么问原创 2020-05-08 18:28:40 · 10942 阅读 · 0 评论 -
面试官:如何实现一个乐观锁(小白都能看得懂的代码)
java多线程中的锁分类多种多样,其中有一种主要的分类方式就是乐观和悲观进行划分的。这篇文章主要介绍如何自己手写一个乐观锁代码。不过文章为了保证完整性,会从基础开始介绍。一、乐观锁概念说是写乐观锁的概念,但是通常乐观锁和悲观锁的概念都要一块写。对比着来才更有意义。1、悲观锁概念悲观锁:总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数...原创 2020-05-02 18:59:51 · 12559 阅读 · 6 评论 -
除了Thread和Runnable,你还知道第三种创建线程的方式Callable吗
相信大多数学过多线程的同学都知道创建线程常见的有三种方式,一种是继承Thread类,一种是实现Runnable接口,最后一种就是Callable,今天主要是对最后不常见的Callable方式进行介绍。一、为什么要Callable接口既然有了前面两种接口,为什么还需要第三种呢?这是因为前两种方式存在着一种缺陷,我们先来看看前面两种实现的方式,然后再来揭晓:class MyThread exte...原创 2020-03-01 16:29:23 · 11958 阅读 · 0 评论 -
详解java中一个面试常问的知识点-阻塞队列
学习数据结构的时候介绍过队列,今天介绍一种队列的其中一种,叫做阻塞队列。这个知识点属于多线程中的一个模块,对于我们理解消息中间件有份非常大的用处,希望对你有帮助。一、什么是阻塞队列1、概念理解队列比较好理解,数据结构中我们都接触过,先进先出的一种数据结构,那什么是阻塞队列呢?从名字可以看出阻塞队列其实也就是队列的一种特殊情况。举个例子来说明一下吧,我们去餐馆吃饭,一个接一个的下单,这时候就是...原创 2020-02-29 20:28:35 · 11292 阅读 · 0 评论 -
23、详解java中一个分而治之的框架ForkJoin
在古代,皇帝要想办成一件事肯定不会自己亲自去动手,而是把任务细分发给下面的大臣,下面的大臣也懒呀,于是把任务继续分成几个部分,继续下发,于是到了最后最终负责的人就完成了一个小功能。上面的领导再把这些结果一层一层汇总,最终返回给皇帝。这就是分而治之的思想,也是我们今天的主题ForkJoin。一、简介从JDK1.7开始,Java提供ForkJoin框架用于并行执行任务,它的思想就是讲一个大任务分割...原创 2019-11-08 16:00:21 · 260 阅读 · 0 评论 -
22、一个带有邮戳的锁StampedLock(jdk1.8出现)
jdk1.8真的可以作为一个宝藏,随便一个新的特性都足以写一本书,今天分析一个在jdk1.8中,引入的一个新的带有邮戳的StampedLock。这篇文章主要从使用的角度来分析一下:一、为什么会需要StampedLock?任何一个新引入的知识都是为了解决以往系统中出现的问题,否则新引入的将变得毫无价值。我曾经写过一些关于ReentrantReadWriteLock, ReentrantLock ...原创 2019-11-08 14:44:00 · 219 阅读 · 0 评论 -
21、可重入排它锁ReentrantReadWriteLock使用详解
ReentrantReadWriteLock是一把可重入读写锁,这篇文章主要是从使用的角度帮你理解,希望对你有帮助。一、性质1、可重入如果你了解过synchronized关键字,一定知道他的可重入性,可重入就是同一个线程可以重复加锁,每次加锁的时候count值加1,每次释放锁的时候count减1,直到count为0,其他的线程才可以再次获取。2、读写分离我们知道,对于一个数据,不管是几个...原创 2019-11-04 16:07:36 · 468 阅读 · 2 评论 -
19、一半是天使一半是魔鬼的Unsafe类详解
可能我们会奇怪,java中竟然给一个类起名字叫做“不安全”。慢慢看,你就会发现这个类的神奇之处,虽然功能很强大,但是的确不那么安全。一、简单介绍首先在Oracle的Jdk8无法获取到sun.misc包的源码,想看此包的源码可以直接下载openjdk。1、预备工作openjdk的源码我下载的是openjdk-8u40-src-b25-10_feb_2015,有需要的可以私信我,如果是我公众号...原创 2019-10-29 15:50:02 · 270 阅读 · 0 评论 -
18、彻底理解ReentrantLock可重入锁的使用
java除了使用关键字synchronized外,还可以使用ReentrantLock实现独占锁的功能。而且ReentrantLock相比synchronized而言功能更加丰富,使用起来更为灵活,也更适合复杂的并发场景。这篇文章主要是从使用的角度来分析一下ReentrantLock。一、简介ReentrantLock常常对比着synchronized来分析,我们先对比着来看然后再一点一点分析...原创 2019-10-28 16:17:30 · 730 阅读 · 2 评论 -
17、详解java线程同步工具Semaphore的使用
Semaphore是java并发包里面的一个工具类,我们限制可以访问某些资源的线程数目就可以使用Semaphore了。这篇文章将对Semaphore的概念和使用进行一个详解。一、概念理解官方是这样解释的:Semaphore用于限制可以访问某些资源(物理或逻辑的)的线程数目,他维护了一个许可证集合,有多少资源需要限制就维护多少许可证集合,假如这里有N个资源,那就对应于N个许可证,同一时刻也只...原创 2019-10-25 17:39:41 · 496 阅读 · 0 评论 -
16、解决线程间协作问题的工具类Exchanger详解
在很久之前我曾写过一篇一篇文章介绍线程间如何进行通信的问题,当时使用的是等待通知模型,这篇文章介绍一个java提供的用于两个线程间通信的工具类Exchanger。一、概念理解Exchanger的作用就是为了两个线程之间交换数据,他提供了一个内部方法exchange,这个内部方法就好比是一个同步点,只有两个方法都到达同步点,才可以交换数据。我们换一张图来演示一波。也就是说只有线程A和线程B都...原创 2019-10-24 17:22:59 · 170 阅读 · 0 评论 -
15、详解java中的同步工具类CyclicBarrier
之前介绍了java中另一个同步工具类CountDownLatch,这篇文章主要介绍CyclicBarrier。一、概念理解CyclicBarrier允许一组线程在到达某个栅栏点(common barrier point)互相等待,直到最后一个线程到达栅栏点,栅栏才会打开,处于阻塞状态的线程恢复继续执行。就比如说我们在打王者的时候,十个人必须全部加载到100%,才可以开局。否则只要有一个人没有...原创 2019-10-23 22:31:25 · 175 阅读 · 0 评论 -
14、详解java同步工具类CountDownLatch
这篇文章主要讲解java中一个比较常用的同步工具类CountDownLatch,不管是在工作还是面试中都比较常见。我们将通过案例来进行讲解分析。一、定义CountDownLatch的作用很简单,就是一个或者一组线程在开始执行操作之前,必须要等到其他线程执行完才可以。我们举一个例子来说明,在考试的时候,老师必须要等到所有人交了试卷才可以走。此时老师就相当于等待线程,而学生就好比是执行的线程。注...原创 2019-10-22 16:39:46 · 2245 阅读 · 0 评论 -
13、解决java多线程ABA问题的AtomicStampedReference
AtomicStampedReference是一个带有时间戳的对象引用,能很好的解决CAS机制中的ABA问题,这篇文章将通过案例对其介绍分析。一、ABA问题ABA问题是CAS机制中出现的一个问题,他的描述是这样的。我们直接画一张图来演示,什么意思呢?就是说一个线程把数据A变为了B,然后又重新变成了A。此时另外一个线程读取的时候,发现A没有变化,就误以为是原来的那个A。这就是有名的ABA问题...原创 2019-10-22 15:36:18 · 767 阅读 · 0 评论 -
12、详解Java并发编程中的AtomicBoolean
如果看过我之前的文章都知道这几天一直在更新java多线程这块的知识点,因为这块的知识点确实是比较多而且也别繁杂,因此对于java多线程基础知识点也会在两个多月的时间全部写完,这篇文章主要是针对java并发包下的一个原子类AtomicBoolean的讲解。一、为什么使用AtomicBoolean?我们平时一般都是使用的boolean来表示布尔变量,但是在多线程情况下boolean是非线程安全的。...原创 2019-10-20 20:28:32 · 464 阅读 · 0 评论 -
10、java中的原子类AtomicInteger详解(基于jdk1
java并发包里面的类一直是学习和面试的重点,这篇文章主要是对java并发包的其中一个类AtomicInteger的讲解。从为什么要出现AtomicInteger再到其底层原理来一个分析。一、从a++说起为什么使用AtomicInteger我们知道java并发机制中主要有三个特性需要我们去考虑,原子性、可见性和有序性。synchronized关键字可以保证可见性和有序性却无法保证原子性。而这个...原创 2019-10-17 14:44:42 · 619 阅读 · 0 评论 -
11、java并发编程中一个著名的问题CAS原理分析
学习Java并发编程,CAS机制都是一个不得不掌握的知识点。这篇文章主要是从出现的原因再到原理进行一个解析。希望对你有所帮助。一、为什么需要CAS机制?为什么需要CAS机制呢?我们先从一个错误现象谈起。我们经常使用volatile关键字修饰某一个变量,表明这个变量是全局共享的一个变量,同时具有了可见性和有序性。但是却没有原子性。比如说一个常见的操作a++。这个操作其实可以细分成三个步骤:(1...原创 2019-10-17 14:20:16 · 389 阅读 · 0 评论 -
9、你应该理解的java并发关键字volatile
提高java的并发编程,就不得不提volatile关键字,不管是在面试还是实际开发中 volatile都是一个应该掌握的技能。他的重要性不言而喻。因此也有必要学好。一、为什么要用到volatile关键字?使用一个新技术的原因肯定是当前存在了很多问题,在Java多线程的开发中有三种特性:原子性、可见性和有序性。我们可以在这里简单的说一下:1、原子性(Atomicity)原子性是指在一个操作中...原创 2019-10-16 11:08:49 · 376 阅读 · 0 评论 -
7、这篇文章带你彻底理解Synchronized关键字
Synchronized关键字一直是工作和面试中的重点。这篇文章准备彻彻底底的从基础使用到原理缺陷等各个方面来一个分析,这篇文章由于篇幅比较长,但是如果你有时间和耐心,相信会有一个比较大的收获,所以,学习请慢慢来。这篇文章主要从以下几个方面进行分析讲解.1、Synchronized关键字的简介,主要是为什么要使用Synchronized关键字,极其作用地位。2、Synchronized关键字的...原创 2019-10-08 13:56:02 · 290 阅读 · 0 评论 -
5、分析一个常见的java多线程通信问题(假死现象)
一件复杂的事,一个人如果不能做,两个人又做的不好,一群人就可能很好的解决了。对于线程来说也是,通过多个线程就能完成一个更复杂的功能,这就需要多个线程协作,协作就需要交流,但是交流总是会出问题的。在这篇文章中我们分析一下java多线程通信过程中出现的一个假死现象。然后给出一个解决办法。一、假死现象重现为了更好地演示我们的实例,我们使用生产者消费者模式,一边生产一边消费。下面我们先试着实现一下...原创 2019-09-28 15:35:29 · 724 阅读 · 0 评论 -
java是如何解决单线程之间通信问题的呢?这篇文章带给你答案
人与人之间通过交流构成了这个丰富多彩的世界,在计算机中,通过即时通信工具传递信息为我么的生活增添了很多乐趣也提供了很多遍历,而在java线程的世界里,线程之间的通信,可以极大的增强我们的功能,今天就带你一块走进线程通信的世界里。**这篇文章是基础入门文章,主要是wait和notify来解决单线程通信问题的。**对于多线程通信极其实现方式我会在后续的课程中依次推出。不喜勿喷。一、基本认识在...原创 2019-09-27 09:55:18 · 250 阅读 · 0 评论 -
java多线程(1)基础入门
多线程这块一直是面试的重点,也是开发当中的重点,于是下决定把这一块的内容吃透它。整个系列的基础文章最少就在60篇以上,因为这块的知识看一两篇确实感觉没什么作用,需要有一个体系的才好。这也是第一篇文章。点到为止。一、认识线程1、概念什么是线程呢?线程是进程划分成的更小的运行单位。就好比电脑QQ是一个进程,里面还有各种子模块,比如QQ空间,个性皮肤等子功能。这里出现了另外一个名词进程。...原创 2019-08-16 16:57:08 · 158 阅读 · 0 评论 -
java多线程(3)线程构造函数(源码剖析)
在上一篇文章中对线程状态生命周期和常见的线程api进行了一个讲解。这篇文章开始着重对其构造方法进行一个说明,也将揭晓为什么我们调用了start方法就能启动一个线程。一、守护线程和非守护线程我们获取线程的id的时候会发现每次都不是0,这是因为在java虚拟机运行一个线程的时候会默认启动一些其他的线程,来为我们的线程服务。默认创建的和我们自己创建的线程是有区分的。这就要区分守护线程和非守护线程了。...原创 2019-08-20 16:58:40 · 399 阅读 · 0 评论 -
java多线程(2)线程生命周期和常见api
上一篇文章对java线程的一些相关概念,进行了一个认识,并且还举出了一个基本的案例,这篇文章我们将对线程的常用API和生命周期进行一个讲解分析。一、从最简单的例子说起再开始讲解java线程的api我们还需要先对线程有一个回顾和了解。对此,给出一个最基本的线程案例。public class MyThread extends Thread { private String name; pub...原创 2019-08-19 22:09:48 · 322 阅读 · 0 评论