【Java 多线程并发】 join()方法
【Java 多线程并发】 join()方法Metadatatitle: 【Java 多线程并发】 join()方法
date: 2023-07-04 23:28
tags:
- 行动阶段/完成
- 主题场景/程序
- 笔记空间/KnowladgeSpace/ProgramSpace/BasicsSpace
- 细化主题/Java
categories:
- Java
keywords:
- Java
description: 【Java 多线程并发】 join()方法
概述join()方法是Thread类中的一个方法,可以由线程对象调用。在当前线程调用join()方法时并不需要提前自己写同步代码块来获取对象锁,调用了join()方法也不会释放当前线程所持有的对象锁。
适用场景
需要等待某几件事情完成后才能继续往下执行
作用
当线程任务量大时,保证 main 线程在这些线程运行结束后再结束、
可控制子线程间执行顺序
注意点
join阻塞的是当前线程,并不是join方法的线程对象对应的线程
唤醒当前线程的操作是在JVM底层实现的,并没有显式调用notify ...
【Java 多线程并发】 线程的通知与等待
【Java 多线程并发】 线程的通知与等待Metadatatitle: 【Java 多线程并发】 线程的通知与等待
date: 2023-07-04 23:08
tags:
- 行动阶段/完成
- 主题场景/程序
- 笔记空间/KnowladgeSpace/ProgramSpace/BasicsSpace
- 细化主题/Java
categories:
- Java
keywords:
- Java
description: 【Java 多线程并发】 线程的通知与等待
概述wait()、notify/notifyAll() 方法都是Object的本地final方法,无法被重写。
obj.wait()
wait()是Object里面的方法,Object是所有对象的父类,即所有对象都可以调用wait()方法。
直到发生以下几种情况才会恢复执行:
其他线程调用了该共享对象的 notify() 方法或者 notifyAll() 方法(继续往下走)
其他线程调用了该线程的 interrupt() 方法,该线程会 InterruptedException 异常返回
使 ...
【Java 多线程并发】 线程睡眠、阻塞、挂起、终止
【Java 多线程并发】 线程睡眠、阻塞、挂起、终止Metadatatitle: 【Java 多线程并发】 线程睡眠、阻塞、挂起、终止
date: 2023-07-04 22:50
tags:
- 行动阶段/完成
- 主题场景/程序
- 笔记空间/KnowladgeSpace/ProgramSpace/BasicsSpace
- 细化主题/Java
categories:
- Java
keywords:
- Java
description: 【Java 多线程并发】 线程睡眠、阻塞、挂起、终止
概述
睡眠会使线程进入到睡眠状态指定的时间,过了指定时间后就会被唤醒继续向下执行。睡眠能够使线程在执行时间内暂停执行,过了指定时间之后就会自动恢复执行。此时线程也在内存中。
挂起会让线程进入挂起状态,恢复之后线程才会继续向下执行。挂起能够使线程暂停执行,并且暂停执行期间线程被转移到了外存中。
阻塞会使线程进入到阻塞状态,恢复之后线程才会继续向下执行。阻塞能够使线程暂停执行,此时线程在内存中阻塞等待。
睡眠
Thread.sleep()
由用户控制的
睡眠时线程不 ...
【Java 多线程并发】 Java中线程的创建和运行
【Java 多线程并发】 Java中线程的创建和运行Metadatatitle: 【Java 多线程并发】 Java中线程的创建和运行
date: 2023-07-04 22:40
tags:
- 行动阶段/完成
- 主题场景/程序
- 笔记空间/KnowladgeSpace/ProgramSpace/BasicsSpace
- 细化主题/Java
categories:
- Java
keywords:
- Java
description: 【Java 多线程并发】 Java中线程的创建和运行
概述创建和运行线程的三种方法
继承 Thread 类并且重写 run 方法
实现 Runnable接口的 run 方法
使用 Callable接口和FutureTask类方式
Thread类和Runnable接口的区别
Runnable接口可以实现线程之间资源共享,而Thread类不能
实现Runnable接口相对于继承Thread类的优点
适合多个相同程序代码的线程去处理同一资源的情况。
可以避免由于Java的单继承特性带来的局限。
增强了程序的健壮性,代 ...
【Java 多线程并发】 线程,进程,协程的详细解释
【Java 多线程并发】 线程,进程,协程的详细解释Metadatatitle: 【Java 多线程并发】 线程,进程,协程的详细解释
date: 2023-07-04 22:27
tags:
- 行动阶段/完成
- 主题场景/程序
- 笔记空间/KnowladgeSpace/ProgramSpace/BasicsSpace
- 细化主题/Java
categories:
- Java
keywords:
- Java
description: 【Java 多线程并发】 线程,进程,协程的详细解释
概述
线程、进程、协程的区别
进程拥有自己独立的堆和栈,既不共享堆,亦不共享栈,进程由操作系统调度(内核态)。
线程拥有自己独立的栈和共享的堆,共享堆,不共享栈,线程亦由操作系统调度(内核态),至少标准线程是这样的。
协程和线程一样共享堆,不共享栈,协程由程序员在协程的代码里显示调度,也就是由程序自己来控制调度(用户态)。
什么是进程和线程
进程是什么呢?进程是一个具有一定独立功能的程序在一个数据集合上依次动态执行的过程。进程是一个正在执行的程序的实例,包括程序 ...
【Java 多线程并发】 ReentrantReadWriteLock
【Java 多线程并发】 ReentrantReadWriteLockMetadatatitle: 【Java 多线程并发】 ReentrantReadWriteLock
date: 2023-07-04 22:01
tags:
- 行动阶段/完成
- 主题场景/程序
- 笔记空间/KnowladgeSpace/ProgramSpace/BasicsSpace
- 细化主题/Java
categories:
- Java
keywords:
- Java
description: 【Java 多线程并发】 ReentrantReadWriteLock
概述ReentrantReadWriteLock采用读写锁的思想,能提高并发的吞吐量;
读写锁
读锁和写锁的占用(重入)次数都是共用state字段,高位记录读锁,地位记录写锁,所以读锁和写锁的最大占用次数为2^16;
读锁和写锁都是可重入的;
读锁是共享锁,允许多个线程获取,互相不会影响,即读读不互斥;
写锁是排他锁(互斥锁),只允许一个线程获取;
读写、写读和写写是会互斥的,前者占有着锁,后者需要进入AQS队 ...
【Java 多线程并发】 ReentrantLock
【Java 多线程并发】 ReentrantLockMetadatatitle: 【Java 多线程并发】 ReentrantLock
date: 2023-07-04 17:10
tags:
- 行动阶段/完成
- 主题场景/程序
- 笔记空间/KnowladgeSpace/ProgramSpace/BasicsSpace
- 细化主题/Java
categories:
- Java
keywords:
- Java
description: ReentrantLock是一个可重入且互斥的锁,它具有与使用synchronized监视器锁相同的基本行为和语义,但它是继承了Lock接口,与synchronized关键字相比,它更灵活、更强大,增加了轮询、超时、中断等高级功能。
概述ReentrantLock就是一个互斥锁,默认是非公平锁。并且是一个可中断的锁。
特点
可重入性
公平性
条件变量
可中断
使用流程
创建一个ReentrantLock对象。
在需要保护共享资源的代码块中,使用lock()方法获取锁。
在使用完共享资源后,使用unlock()方 ...
【Java 多线程并发】 Condition条件锁
【Java 多线程并发】 Condition条件锁Metadatatitle: 【Java 多线程并发】 Condition条件锁
date: 2023-07-04 16:54
tags:
- 行动阶段/完成
- 主题场景/程序
- 笔记空间/KnowladgeSpace/ProgramSpace/BasicsSpace
- 细化主题/Java
categories:
- Java
keywords:
- Java
description: 【Java 多线程并发】 Condition条件锁
概述条件锁中也维护了一个队列,为了和AQS的同步队列区分,我这里称为条件队列,firstWaiter是队列的头节点,lastWaiter是队列的尾节点。
Condition的条件队列和AQS的同步队列不完全一样
Condition的条件队列和AQS的同步队列都是通过节点类Node组成的。但是AQS的队列头节点是不存在任何值的,是一个虚节点; Condition的队列头节点是存储着实实在在的元素值的,是真实节点。而且条件队列是一个单向队列,同步队列是一个双向队列
await ...
【Java 多线程并发】 Lock接口
【Java 多线程并发】 Lock接口Metadatatitle: 【Java 多线程并发】 Lock接口
date: 2023-07-04 16:35
tags:
- 行动阶段/完成
- 主题场景/程序
- 笔记空间/KnowladgeSpace/ProgramSpace/BasicsSpace
- 细化主题/Java
categories:
- Java
keywords:
- Java
description: 【Java 多线程并发】 Lock接口
概述Lock接口的实现(ReentrantLock等实现类)基本都是通过聚合了一个AbstractQueuedSynchronizer同步器的内部子类来完成线程访问控制的。
public interface Lock {
// 获取锁
void lock();
// 获取锁(可中断)
void lockInterruptibly() throws InterruptedException;
// 尝试获取锁,如果没获取到锁,就返回false
boolean t ...
【Java 多线程并发】 locks
【Java 多线程并发】 locksMetadatatitle: 【Java 多线程并发】 locks
date: 2023-07-04 16:34
tags:
- 行动阶段/完成
- 主题场景/程序
- 笔记空间/KnowladgeSpace/ProgramSpace/BasicsSpace
- 细化主题/Java
categories:
- Java
keywords:
- Java
description: 【Java 多线程并发】 locks
【Java 多线程并发】 locks
locks包中提供了很多种锁,locks包的结构如下:
AbstractOwnableSynchronizer:一个线程拥有的同步器,这个类提供了创建锁和相关同步器的基础。
AbstractQueuedLongSynchronizer:其原理与AbstractQueuedSynchronizer基本一致,只是它的所有的同步状态都是用long变量来维护的,而不是int,在需要64位的属性来表示状态的时候会很有用。
AbstractQueuedSynchronizer:为实现 ...