![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
多线程
文章平均质量分 62
多线程系列学习
qiuxinfa123
这个作者很懒,什么都没留下…
展开
-
线程池(二)浅析ThreadPoolExecutor
上一篇文章,聊了一下线程池的总体情况,今天主要聊聊线程池的核心类:ThreadPoolExecutor,接着上篇文章,先分析其重要的属性: // 阻塞队列,用来存放提交的任务 private final BlockingQueue<Runnable> workQueue; // 可重入锁 private final ReentrantLock mainLock = new ReentrantLock(); // worker集合,一个worker包装了原创 2021-04-21 00:32:58 · 434 阅读 · 0 评论 -
线程池总体概述
线程池主要是为了线程的复用,减少线程频繁创建和销毁的开销。ThreadPoolExecutor便是“线程池”,其继承结构如下:顶层接口Executor,只定义了一个执行任务的方法:void execute(Runnable command);ExecutorService则对Executor进行了拓展,增加了shutdown,submit等方法:而AbstractExecutorService则是对ExecutorService进行了默认实现,主要还是看ThreadPoolExec原创 2021-04-20 00:19:14 · 113 阅读 · 0 评论 -
多线程系列学习:AQS(二)释放锁
前面一篇文章写了如何获取锁:多线程系列学习:AQS(一)获取锁,下面以unlock()方法为入口,看看AQS如何释放锁: public void unlock() { sync.release(1); }接着看release()方法: public final boolean release(int arg) { if (tryRelease(arg)) { Node h = head; if原创 2021-04-15 23:30:27 · 221 阅读 · 0 评论 -
多线程系列学习:AQS(一)获取锁
AQS是AbstractQueuedSynchronizer的简称,juc包下锁的实现,基本上需要借助于AQS的功能,如下图所示:通过继承结构,可以看到,常用的可重入锁ReentrantLock,以及同步辅助工具类CountDownLatch、Semaphore,都用到了AQS。首先要明白:锁分为独占锁和共享锁,独占锁又分为公平锁和非公平锁。独占锁:所谓独占锁,就是某一时刻,该锁只能被一个线程占有的 共享锁:共享锁则是某一时刻,该锁可以被多个线程同时占有 公平锁:获取锁的顺序,和请求锁原创 2021-04-14 23:51:29 · 588 阅读 · 0 评论 -
多线程系列学习:LockSupport唤醒指定的线程
LockSupport是线程操作的工具类,其方法都是静态方法,主要是park和unpark方法,实现阻塞和唤醒,先看下方法定义及说明: /** * Disables the current thread for thread scheduling purposes unless the * permit is available. * * <p>If the permit is available then it is consumed and原创 2021-03-23 00:26:54 · 314 阅读 · 0 评论 -
多线程系列学习:CountDownLatch、CyclicBarrier和Semaphore
之所以把这3个类放在一起,因为它们都是线程协作的辅助类。CountDownLatch,可以实现某一些线程,等待其他线程执行完之后,才可以执行 CyclicBarrier,实现了多个线程间的相互等待,直到大家等待的条件满足了,就可以一起执行了 Semaphore,是信号量,可以控制并发的线程数一、CountDownLatchCountDownLatch,更多的是用于等待前面的线程执行完了,后面的才可以执行,测试如下:public class CountDownLatchTest {原创 2021-03-23 00:14:19 · 162 阅读 · 0 评论 -
多线程系列学习:ABA问题
ABA问题,描述的是一个变量v,它的值经历A -> B ->A的变化,导致看起来好像没有变一样,其实,第二次出现的A已经不是第一次出现的A了,是被修改过的。下面复现ABA问题,并解决测试代码:public class ABATest { public static void main(String[] args) { CountDownLatch latch = new CountDownLatch(2); AtomicInteger num原创 2021-03-22 23:47:41 · 996 阅读 · 0 评论 -
多线程系列学习:AtomicInteger
在 java.util.concurrent.atomic 包下,有很多原子类,这种原子类的出现,解决了多线程环境下,诸如:i++等非原子操作的线程安全问题,包括的类如下:下面以AtomicInteger为例了解其使用及基本原理,先看下类定义及相关说明:根据注释说明,可以大概知道,AtomicInteger主要用来解决类似于自动递增的计数问题,它并不能替代Integer类。注意到,它有一个成员属性 value,并且是用volatile修饰的,从而保证了可见性。首先来看下,不使..原创 2021-03-21 12:13:15 · 709 阅读 · 0 评论 -
多线程系列学习:线程终止
今天聊一下线程的终止,目前知道的是两种方式:通过标志变量终止 通过中断标记终止一、通过标志变量终止通过标志变量,可以终止正在运行的线程,测试代码如下: // 通过标记变量,退出正在运行的线程 static class Demo extends Thread{ // volatile修饰,保证每次读取的都是变量的最新值 private volatile boolean runFlag = true; @Overrid..原创 2021-03-21 00:53:34 · 73 阅读 · 0 评论 -
多线程系列学习:线程调度
今天主要学习一下线程调度,包括:休眠、加入和让步。一、线程的休眠先来看下,线程休眠的方法定义: /** * Causes the currently executing thread to sleep (temporarily cease * execution) for the specified number of milliseconds, subject to * the precision and accuracy of system time原创 2021-03-21 00:37:57 · 201 阅读 · 0 评论 -
多线程系列学习:线程间通信
为什么需要线程间的通信?其实,换一种问法会更容易理解其出现的意义:为什么需要线程间的协作?提到协作,意味着单个线程是无法完成任务的,就比如我们工作中,个人的能力是有限的,大多数情况下都需要团结协作,然后最终完成了任务。那么,在这里,你可以把团队的每一个人看作一个线程来理解,就比较容易理解线程间协作的必要性了。那么,线程间实现的通信方式哪有些呢?目前,我知道的有2种:通过对象的wait()、notify()和notifyAll()来实现 通过java.util.concurrent.locks.Co原创 2021-03-17 21:54:44 · 72 阅读 · 0 评论 -
多线程系列学习:synchronized关键字的理解与使用
关于synchronized关键字的学习,主要包括以下几个方面:为什么要使用synchronized关键字? 如何使用synchronized关键字?为什么要使用synchronized对同一个对象的属性进行并发访问,如果处理不当,就很容易出现读取到另一个线程修改后的数据,造成程序运行出错。看文字可能不太好理解,请看示例代码:public class SyncTest { public static void main(String[] args) { N.原创 2021-03-17 00:38:47 · 105 阅读 · 0 评论 -
多线程系列学习:线程创建的几种方式
线程的创建,个人理解,本质上还是创建了Thread对象,因为Callable接口最终会被包装成Runnable接口的对象,而Runnable接口对象只是Thread中的target而已。而启动一个线程,最终也是调用线程对象Thread的start()方法。创建线程的几种常见方式:继承Thread类 实现Runnable接口 实现Callable接口 通过线程池创建(这种方式后面再介绍)一、继承Thread类继承Thread类,重写run()方法class MyThread e.原创 2021-03-16 20:38:04 · 91 阅读 · 0 评论 -
多线程系列学习:线程状态
关于Java线程的状态,一般分为5状态和6状态,不管是5状态划分,还是6状态划分,都是为了更好的理解线程的运行流程,当然了,Thread源码里面确实是划分为6状态的。5状态划分1.新建状态(New) : 线程对象被创建后,就进入了新建状态。例如,Thread t = new Thread()。2.就绪状态(Runnable): 也被称为“可执行状态”。线程对象被创建后,调用其start()方法启动该线程,线程就进入到就绪状态,此时的线程,万事俱备,只欠CPU。3.运...原创 2021-03-16 00:16:35 · 48 阅读 · 0 评论 -
多线程系列学习:为什么需要多线程?
在学习多线程之前,有必要了解为什么会出现多线程,文章主要内容:有了进程,为什么还需要线程? 多线程的使用场景有了进程,为什么还需要线程?首先,要明白一点,进程包含线程,一个进程至少有一个线程,但线程依赖于进程而存在。先看下进程和线程的基本概念:进程:是对运行时程序的封装,是系统进行资源调度和分配的的基本单位,实现了操作系统的并发,例如我们的QQ、微信,在没有运行时,就只是程序,但是当这些程序被调入内存执行,就会创建对应的进程被cpu调度 线程:是进程的子任务,是CPU调度的基本..原创 2021-03-15 21:35:06 · 436 阅读 · 0 评论 -
线程池原理
原文作者已经写得很好,这里仅仅是方便日后自己查找复习,原文地址:https://www.cnblogs.com/dolphin0520/p/3932921.html转载 2019-08-19 22:10:08 · 73 阅读 · 0 评论