Java 并发编程
文章平均质量分 91
本专栏介绍了和Java相关的一些多线程操作,例如线程池、锁机制、死锁等
存在morning
乐于了解新技术,善于复盘总结,不是很聪明,但能够持续进步。
展开
-
【Java并发编程 零】Java并发编程看这一篇就够了
本篇Blog为接下来的Java并发编程精华版本,重点知识,如果某个知识点不理解,可以再深入的看本专栏中的其它Blog内容介绍。为了突出重点,本篇Blog以问答的形式展示,将所有的知识点进行串联。...原创 2021-03-10 23:53:14 · 625 阅读 · 1 评论 -
【Java并发编程 一】并发编程的挑战
本文是Java并发编程系列的第一篇,在正式进行Java中的并发编程方式之前,我们先来了解下什么是并发编程。并发编程的优势是什么,又有什么挑战和问题,以及该如何解决?那么首先要搞清楚什么是并发的概念?并发的基本概念并发是指两个或多个事件在同一时间间隔内发生,在多道程序环境下,一段时间内宏观上有多个程序在同时执行,而在同一时刻,单处理器环境下实际上只有一个程序在执行,故微观上这些程序还是在分时的交替进行。操作系统的并发是通过分时得以实现的,和串行以及并行的概念区别:串行:顺序做不同事的能力:先洗衣服,原创 2021-02-27 11:22:26 · 245 阅读 · 1 评论 -
【Java并发编程 二】JMM内存模型
首先搞清楚一个概念,什么是内存模型?首先来看看如何定义,内存模型:在特定的操作协议下对特定的内存或高速缓存进行读写访问的过程抽象。处理器中的内存模型多数运算中,处理器都要和内存进行交互,如读取数据、存储结果等。由于计算机存储设备和处理器运算速度有几个数量级的差距,所以现代计算机系统都不得不加入一层读写速度尽可能接近处理器运算速度的高缓存Cache来作为内存与处理器之间的缓冲:将运算需要使用的数据复制到缓存中,让运算能快速进行,当运算结束后再从缓存中同步回内存,这样处理器就无须等待缓慢的内存读写了。 解决原创 2021-02-28 12:05:57 · 386 阅读 · 0 评论 -
【Java并发编程 三】Java并发机制的底层实现
上一篇Blog介绍了什么是并发、并发编程的挑战,本篇Blog我们来学习下Java的底层对并发是如何支持的,也就是Java底层的并发机制到底是什么样的?在JVM系列的Blog我们知道,Java代码在编译后会变成Java字节码,字节码被类加载器加载到JVM里,JVM执行字节码,最终需要转化为汇编指令在CPU上执行,Java中所使用的并发机制依赖于JVM的实现和CPU的指令。共享变量和资源什么是共享资源和变量,在JVM模型中来说,就是JVM的堆和⽅法区,这部分内容是所有线程共享的区域:堆是所有线程共享的原创 2021-02-27 17:07:56 · 391 阅读 · 0 评论 -
【Java并发编程 四】Java的进程与线程
什么是进程?进程是程序的⼀次执⾏过程,是系统运⾏程序的基本单位,因此进程是动态的。系统运行和关闭⼀个程序即是⼀个进程从创建,运⾏到消亡的过程。在 Java 中,当我们启动 main 函数时其实就是启动了⼀个 JVM 的进程,⽽ main 函数所在的线程就是这个进程中的⼀个线程,也称主线程什么是线程?线程与进程相似,但线程是⼀个⽐进程更⼩的执⾏单位。⼀个进程在其执⾏的过程中可以产⽣多个线程。与进程不同的是同类的多个线程共享进程的堆和⽅法区资源,但每个线程有⾃⼰的程序计数器、虚拟机栈和本地⽅法栈,所以系统在产原创 2021-02-28 21:51:02 · 319 阅读 · 0 评论 -
【Java并发编程 五】线程生命周期及状态切换
上一篇Blog进行了总览,本片Blog即介绍在Java中线程的生命周期和状态是如何切换的,也就是Java多线程的调度方式,只有掌握了调度方式,才能推演出无序的多线程的执行顺序,还原程序的执行顺序。在正式学习前,先简单了解下线程的分类:主线程:JVM调用程序main()所产生的线程。用户线程/前台线程:前台用户创建的线程,执行任务的线程,man函数主线程,也是一个前台线程守护线程/后台线程:指为其他线程提供服务的线程,也称为守护线程。JVM的垃圾回收线程就是一个后台线程。用户线程和守护线程的区别在于,原创 2021-02-28 21:48:43 · 406 阅读 · 0 评论 -
【Java并发编程 六】Java线程安全与同步方案
我们知道面向对象的编程思想是站在现实世界的角度去抽象和解决问题,它把数据和行为都看做是对象的一部分。当多个线程访问一个对象时如果不考虑这些线程在执行时环境下的调度和交替执行,也不需要进行额外的同步,或者在调用方进行任何其他的协调操作,调用这个对象的行为都可以获得正确的结果,那么这个对象就是线程安全的Java的线程安全我们这里讨论的线程安全,限定于多个线程之间存在共享数据访问这个前提,因为如果一段代码根本不会与其他线程共享数据,那么从线程安全的角度来看,程序是串行执行还是多线程执行对它来说是完全没有区别的原创 2021-03-02 21:28:36 · 1510 阅读 · 7 评论 -
【Java并发编程 七】JUC并发包概述
如果说前面六篇Blog是帮助我们上手Java并发编程的底层基础,了解实现原理,那么接下来的这几篇就可以称之为实战训练,内容全部来自JUC并发包,JUC并发包提供了一切并发底层原理和实现机制的封装,并且做了大幅度的扩展,方便我们的使用。JDK并发工具类是JDK1.5引入的一大重要的功能,集中在Java.util.concurrent包下。java.util.concurrent包主要包含了原子类、并发锁、并发集合和队列、线程池、并发工具类1,原子类,位于java.util.concurrent.ato原创 2021-03-02 23:00:25 · 425 阅读 · 1 评论 -
【Java并发编程 八】JUC并发包下原子类
atomic 是指一个操作是不可中断的。即使是在多个线程一起执行的时候,一个操作一旦开始,就不会被其他线程干扰,所以,所谓原子类说简单点就是具有原子操作特征的类,原子操作类提供了一些修改数据的方法,这些方法都是原子操作的,在多线程情况下可以确保被修改数据的正确性,我们在前边的Java并发机制底层实现中了解到,通过CAS操作可以实现原子操作,整体分类如下基本原子类基本原子类型包含三种,都比较简单,这里我们以AtomicInteger为例进行介绍:AtomicInteger:int 类型原子类Atom原创 2021-03-03 09:50:14 · 238 阅读 · 0 评论 -
【Java并发编程 九】JUC并发包下的锁
根据锁出现在Java中的时间,Java中的锁,可以分为同步锁和JUC包中的锁,同步锁指的是通过synchronized关键字来进行同步,实现对竞争资源的互斥访问的锁,同步锁的原理是:对于每一个对象,有且仅有一个同步锁,不同的线程能共同访问该同步锁。在同一个时间点,该同步锁能且只能被一个线程获取到。这样,获取到同步锁的线程就能进行CPU调度,从而在CPU上执行;而没有获取到同步锁的线程,必须进行等待,直到获取到同步锁之后才能继续运行相比同步锁,JUC包中的锁的功能更加强大,它为锁提供了一个框架,原创 2021-03-03 22:37:30 · 421 阅读 · 4 评论 -
【Java并发编程 十】JUC并发包下的工具类
JUC并发包下有四个并发工具类,闭锁CountDownlatch、栅栏CyclicBarrier、信号量Semaphore、交换器Exchanger。CountDownlatch通常用于主线程等待其他任务线程执行完毕的场景,类似于JoinCyclicBarrier主要阻塞当前线程,等待其他线程(大家无论谁先跑到A点,必须要等其他线程也到达了A点,大家才能继续)。信号量Semaphore可以用来控制同时访问特定资源的线程数量(比如100个线程只能有10个线程可以获得MySQL连接)。交换器Excha原创 2021-03-04 00:05:21 · 531 阅读 · 2 评论 -
【Java并发编程 十一】JUC并发包下并发容器类
JUC包下的容器类分为两部分,一部分是并发集合类,一部分是并发队列类,其中并发集合类可以解决我们集合使用过程中的多线程并发问题,而并发队列类则主要被当做阻塞队列使用,是线程池中的关键参数之一。接下来我们分两部分来详细介绍下这部分内容。普通集合类Java集合框架主体内容包括Collection集合和Map类;而Collection集合又可以划分为List(队列)、Set(集合)以及队列(Queue),Map类也有自己的不同实现类。依据用途,我们可以把List、Set和Map理解为集合类,Queue当做队原创 2021-03-06 16:20:48 · 473 阅读 · 1 评论 -
【Java并发编程 十二】JUC并发包下线程池
使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题:如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统的效率,因为频繁创建线程和销毁线程需要时间。那么有没有一种办法使得线程可以复用,就是执行完一个任务,并不被销毁,而是可以继续执行其他的任务? 在Java中可以通过线程池来达到这样的效果线程池的优势我们为什么要使用线程池呢?包括上边提到的线程复用,线程池的优势可以总结如下:降低资源消耗。通过重复利用已创建的线程降低线程创建和原创 2021-03-05 23:37:05 · 306 阅读 · 1 评论 -
【Java并发编程 十三】死锁问题及解决方案
我们先看看这样一个生活中的例子:在一条河上有一座桥,桥面较窄,只能容纳一辆汽车通过,无法让两辆汽车并行。如果有两辆汽车A和B分别由桥的两端驶上该桥,则对于A车来说,它走过桥面左面的一段路(即占有了桥的一部分资源),要想过桥还须等待B车让出右边的桥面,此时A车不能前进;对于B车来说,它走过桥面右边的一段路(即占有了桥的一部分资源),要想过桥还须等待A车让出左边的桥面,此时B车也不能前进。两边的车都不倒车,结果造成互相等待对方让出桥面,但是谁也不让路,就会无休止地等下去。这种现象就是死锁。如果把汽车比做进程,桥原创 2021-03-06 17:38:45 · 786 阅读 · 0 评论