Java多线程
文章平均质量分 62
学习Java多线程
小鑫-Chen
持之以恒
展开
-
Java多线程精讲:9、线程管理
9.1 线程组类似于在计算机中使用文件夹管理文件,也可以使用线程组来管理线程,在线程组中定义一组相似(相关)的线程。也可以在线程组中定义子线程组。Thread类有几个构造方法,其中一个允许在创建线程时指定线程组,如果在创建线程时没有指定线程组,则该线程就属于父线程所在的线程组。JVM在创建main线程时会为它指定一个线程组,因此每个Java线程都有一个线程组与之关联,可以调用线程的getThreadGroup()方法返回该线程的线程组。代码演示:package threadgroup;原创 2021-09-25 13:53:17 · 372 阅读 · 0 评论 -
Java多线程精讲:8、读写锁
1、原创 2021-09-14 14:08:21 · 157 阅读 · 0 评论 -
Java多线程精讲:7、Lock显示锁
在JDK5中新增了Lock锁接口,有ReentrantLock实现类等。ReentrantLock锁称为可重入锁,它的功能要比synchronized多。7.1 锁的可重入性锁的可重入性是指,当一个线程获得一个对象锁后,再次请求该对象锁时,可以再次获得该对象的锁。以下代码可以顺利运行下去,代表synchronized里面的锁是具有可重入性的:package lock.reentrant;public class Test01 { public synchronized voi原创 2021-09-13 22:56:39 · 216 阅读 · 0 评论 -
Java多线程精讲:6、线程间通信
6.1 等待/通知机制概念:A线程在运行时需要某个地址中的值,但是该地址还没有值,所以A等待。当B线程往该地址处写入了值后,B线程通知A线程,于是A线程继续执行。上面这样的一个过程就是等待/通知机制。实现:Object类中的wait()方法,可以使执行当前代码的线程等待,暂停执行。直到接到通知或被中断为止。注意:wait()方法只能在同步代码块中由锁对象调用,且调用wait()方法后,当前线程会释放锁。Object类的notify()方法可以唤醒处于等待的线程,该方法也必须在同步代码块中由锁原创 2021-09-07 14:18:35 · 112 阅读 · 0 评论 -
Java多线程精讲:5、线程同步(2)
5.4 CAS CAS(Compare And Swap),是由硬件实现的。 CAS可以将read-modify-write这类的操作转换为原子操作。 i++包括三个操作:读取i的值、i+1、将新的值保存到内存。CAS的原理:在把值写到内存中时,会再次读取该地址的值,如果发现主存中的值与一开始读取到的值不同,则放弃写入(即撤销本次操作);否则就更新进去。使用CAS实现一个线程安全的计数器:package cas;public c...原创 2021-09-01 17:10:48 · 88 阅读 · 0 评论 -
Java多线程精讲:5、线程同步(1)
5.1 线程同步机制线程同步机制是一套用于协调线程之间的数据访问的机制。该机制可以保障线程安全。Java平台提供的线程同步机制包括:锁、volatile关键字、final关键字、static关键字、以及相应的API(如Object.wait()/Object.notify())等。5.2 锁概述 线程安全问题的产生前提是多个线程并发访问共享数据。所以我们将多个线程对共享数据的并发访问转换为串行访问,即一个共享数据一次只能被一个线程访问。锁就是复用这种思路来保...原创 2021-08-31 22:06:51 · 152 阅读 · 0 评论 -
Java多线程精讲:4、Java内存模型
1、每个线程都有独立的栈空间2、每个线程都可以访问堆内存3、计算机的CPU不直接从主存中读取数据,CPU读取数据时,先把主存的数据读到Cache缓存中,然后再把Cache缓存中的数据读到寄存器中。4、JVM中共享的数据可能会被分配到寄存器中,每个CPU都有自己的寄存器,一个CPU不能读取其他CPU的寄存器。如果两个线程分别运行在不同的处理器(CPU)上,而这个共享的数据被分配到寄存器上,会产生可见性问题。5、即使JVM中共享的数据分配到主存中,也不能保证数据的可见性。CPU不直接对主存...原创 2021-08-29 17:58:38 · 113 阅读 · 0 评论 -
Java多线程精讲:3、线程安全问题
3.1 线程安全问题非线程安全:主要是指多个线程对同一个对象的实例变量进行操作时,会出现值被更改,值不同步的问题。线程安全:原子性、可见性、有序性3.2 原子性原子(Atomic)就是不可分割的意思。原子操作的不可分割有两层含义:1)访问(读、写)某个共享变量的操作从其他线程来看,该操作要么已经执行完毕,要么尚未发生。即其他线程看不到当前操作的中间结果。2)访问同一组共享变量的原子操作,是不能够交叉的。Java有两种方式实现原子性:一种是使用锁,另一种是利用处理器的CAS(Com原创 2021-08-29 17:22:40 · 154 阅读 · 0 评论 -
Java多线程精讲:2、线程的生命周期
2.1 线程的生命周期线程的生命周期指的是线程对象的生老病死,及线程的状态。线程生命周期可以通过getState()方法获得,线程的状态是Thread.State枚举类型定义的,由以下几种组成:NEW //新建状态。创建了线程对象,在调用start()启动之前的状态RUNNABLE //可运行状态,它包括READY和RUNNING两个状态。READY状态表示线程可以被线程调度器进行调度,来使它变成RUNNING状态。RUNNING状态表示该线程正在被执行。Thread.y...原创 2021-08-25 23:43:36 · 108 阅读 · 0 评论 -
Java多线程精讲:1、进程和线程介绍
1.1 线程相关概念进程:进程(process)是计算机中的程序关于某数据集合一次运行活动,是操作系统进行资源分配和调度的基本单位。 可以把进程简单理解为操作系统中正在运行的一个程序。线程: 线程(Thread)是进程的一个执行单元。 一个线程是进程中一个单一顺序的控制流,进程的一个执行分支。 进程是线程的容器,一个进程至少有一个线程。 在操作系统中,进程是分配资源的基本单位,如虚拟存储空间...原创 2021-08-24 23:13:32 · 690 阅读 · 3 评论 -
JUC:12、CompletableFuture异步回调
package completable;import java.util.concurrent.CompletableFuture;import java.util.concurrent.ExecutionException;public class CompletableFutureDemo { public static void main(String[] args) throws ExecutionException, InterruptedException { .原创 2021-08-13 23:28:52 · 120 阅读 · 0 评论 -
JUC:11、Fork/Join分支合并框架
11.1 Fork/Join框架概述Fork/Join 可以将一个大的任务拆分成多个子任务进行并行处理,最后将子任务结果合并成最后的计算结果,并进行输出。Fork/Join一共完成两件事情:把一个复杂任务进行拆分,大事化小 把拆分结果进行合并...原创 2021-08-13 23:14:14 · 213 阅读 · 0 评论 -
JUC:10、ThreadPool线程池
10.1 线程池概述线程池(ThreadPool):一种线程使用模式。线程过多会带来调度开销,进而影响缓存局部性和整体性能。而线程池维护着多个线程,等待着监督管理者分配可并发执行的任务,这避免了在处理短时间任务时创建与销毁线程的代价。线程池不仅能保证内核的充分使用,还能防止过分调度。线程池的优势:线程池的工作是控制运行的线程数量。处理过程中将任务放入队列,然后创建线程来进行执行。如果线程数量超多了最大数量,超出数量的线程排队等候。等其他线程执行完毕后,再从队列中取出任务来进行执行。它的主要特点:原创 2021-08-12 22:00:18 · 69 阅读 · 0 评论 -
JUC:9、阻塞队列 BlockingQueue
8.1 什么是阻塞队列阻塞队列(BlockingQueue)是一个支持两个附加操作的队列。这两个附加的操作是:在队列为空时,获取元素的线程会等待队列变为非空。当队列满时,存储元素的线程会等待队列可用。阻塞队列常用于生产者和消费者的场景,生产者是往队列里添加元素的线程,消费者是从队列里拿元素的线程。阻塞队列就是生产者存放元素的容器,而消费者也只从容器里拿元素。我们不用关心什么时候需要阻塞线程,什么时候需要释放线程,因为这些都会被阻塞队列自动完成。8.2 阻塞队列的分类1、ArrayBloc原创 2021-08-10 20:34:46 · 78 阅读 · 0 评论 -
JUC:8、读写锁
8.1 概述悲观锁:可以看到,执行-2000的操作时,因为被-5000的线程抢先拿走了锁,所以它不能执行。悲观锁就是每次获取资源时,都会对其进行上锁。虽然不容易出问题,但是效率低。乐观锁:每个线程都可以拿到资源,不过拿时,也会拿到版本编号。当修改后,确认资源的版本好与自己的是否相同,如果不同,则重新拿资源并获取新的版本编号。可以看到,乐观锁支持多线程修改,但是容易出问题。表锁:对整张表进行上锁。行锁:只对表的一行进行上锁,有可能发生死锁。读锁:共享锁,可以多个线程..原创 2021-08-04 21:48:59 · 98 阅读 · 0 评论 -
JUC:7、强大的辅助类
7.1 减少计数 CountDownLatch概念:CountDownLatch这个类使其他线程各自执行完毕后,这个线程才去执行。是通过一个计数器来实现的,计数器的初始值是线程的数量。每当一个线程执行完毕后,计数器的值就-1,当计数器的值为0时,表示所有线程都执行完毕,然后在闭锁上等待的线程就可以恢复工作了。代码模拟:6个同学都走了之后,班长锁门假设我们用普通方法模拟:package juc;public class CountDownLatchDemo { //六个同学陆续离开原创 2021-08-03 22:22:13 · 81 阅读 · 0 评论 -
JUC:7、callable接口
7.1 创建线程的多种方式1、继承 Thread 类,然后重写run方法2、实现 Runnable 接口,然后实现run方法3、Callable接口4、线程池7.2 Callable接口使用继承Thread类、实现Runnable接口的方法创建线程的缺点是,run()方法无法返回结果。为了能够返回结果,我们可以实现Callable接口的call()方法。Runnable()接口和Callable()接口的异同:前者无返回值,后者有返回值前者不会检查抛出异常,后者会检查抛出异常实现方法不原创 2021-08-03 19:51:58 · 84 阅读 · 0 评论 -
JUC:6、多线程锁
6.1 锁的八种情况1、两个同步方法,一个对象,两个线程,分别调用 getOne()和 getTwo(), 打印? //1 22、在 getOne() 方法中添加睡眠3秒,打印? //1 23、添加非同步方法,启动三个线程,打印? // 3 1 24、创建两个对象,一个调用 getOne() 一个调用getTwo(), 打印? //2 15、将 getOne() 修改为静态同步方法,一个对象,打印? //2 16、将 getTwo() 修改为静态同步方法,一个对象,打印? //1 27、将 g原创 2021-08-03 16:59:41 · 136 阅读 · 0 评论 -
JUC:5、集合的线程安全
5.1 集合线程的不安全演示创建10个线程对同一个List集合进行修改:/** * List集合线程不安全的例子 */public class ThreadDemo4 { public static void main(String[] args) { //创建ArrayList集合 List<String> list = new ArrayList<>(); //创建线程对list进行修改 for(原创 2021-08-03 09:51:41 · 60 阅读 · 0 评论 -
JUC:4、线程间定制化通信
4.1 案例分析原创 2021-07-25 21:55:47 · 76 阅读 · 0 评论 -
JUC:3、线程间通信
3.1 多线程通信概述和案例多线程编程步骤:创建资源类,在资源类创建属性和操作方法在资源类操作方法:判断、干活、通知创建多个线程,调用资源类的操作方法例子:有两个线程,对一个初始化为0的变量,一个对其进行加1操作(在值为0的情况下),一个对其进行减1操作(在值为1的情况下)代码:package communicate;//第一步 创建资源类,定义属性和操作方法class Share { //初始值 private int number = 0;原创 2021-07-19 20:27:10 · 89 阅读 · 0 评论 -
JUC:2、Lock接口
2.1 复习Synchronized1、synchronized是Java中的关键字,是一种同步锁。它修饰的对象有以下几种:修饰一个代码段,被修饰的代码块称为同步语句块。作用范围是大括号括起来的代码,作用对象是调用这个代码块的对象。修饰一个方法,被修饰的方法称为同步方法。作用范围是整个方法,作用对象是调用这个方法的对象。2、案例演示多线程编程步骤:创建资源类,在资源类创建属性和操作方法创建多个线程,调用资源类的操作方法...原创 2021-07-18 11:54:31 · 84 阅读 · 0 评论 -
JUC:1、JUC概述
1.1 JUC简介JUC是java.util.concurrent工具包的简称,这是一个处理线程的工具包,JDK1.5开始出现。1.2 进程和线程的概念1、 进程进程(process)是计算机程序中关于某数据集合的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。在当代面向线程设计的计算机结构中,进程是线程的容器。程序是指令、数据及其组织形式的描述,进程是程序的实体。2、线程线程(thread)是操作系统能够进行调度的最小单位。它被包含在进程之中,是进程中的实际运作单位原创 2021-07-15 10:16:53 · 216 阅读 · 0 评论