多线程
文章平均质量分 94
徐俊生
Write the code, Change the world!
展开
-
[Java并发与多线程]
Java多线程目录第一章 基本概念第二章 synchronized关键字第三章 线程等待与唤醒day day up!原创 2019-08-03 20:51:43 · 371 阅读 · 0 评论 -
Java 并发之 AQS 详解(下)
Java 并发之 AQS 详解原创 2022-09-04 20:56:07 · 508 阅读 · 0 评论 -
Java 并发之 AQS 详解(上)
Java 并发之 AQS 详解原创 2022-09-04 19:58:07 · 600 阅读 · 0 评论 -
Java 线程池实现原理及实战
ThreadPoolExecutor万字详解原创 2022-08-07 17:45:23 · 680 阅读 · 0 评论 -
[Java并发与多线程](一)基本概念
1、进程与线程的关系进程:每个进程都有独立的代码和数据空间(进程上下文),进程间的切换会有较大的开销,一个进程包含1–n个线程。(进程是资源分配的最小单位)线程:同一类线程共享代码和数据空间,每个线程有独立的运行栈和程序计数器(PC),线程切换开销小。(线程是cpu调度的最小单位)2、多线程的实现多进程是指操作系统能同时运行多个任务(程序)。多线程是指在同一程序中有多个顺序流在执行。在...原创 2019-03-13 17:40:02 · 468 阅读 · 0 评论 -
[Java并发与多线程](二)synchronized关键字
Java多线程之基本概念1、synchronized原理2、synchronized基本规则1、synchronized原理在java中,每一个对象有且仅有一个同步锁。这也意味着,同步锁是依赖于对象而存在。当我们调用某对象的synchronized方法时,就获取了该对象的同步锁。例如,synchronized(obj)就获取了“obj”这个对象的同步锁。不同线程对同步锁的访问是互斥的。也就是...原创 2019-07-31 20:27:56 · 311 阅读 · 0 评论 -
[Java并发与多线程](三)让线程停下来
Java多线程之interrupt方法和线程终止方式1、interrupt()说明2、终止线程的方式2.1、终止处于“阻塞状态”的线程2.2、终止处于“运行状态”的线程3、终止线程的示例4、interrupted() 和 isInterrupted()的区别1、interrupt()说明在介绍终止线程的方式之前,有必要先对interrupt()进行了解。关于interrupt(),java的...原创 2019-08-03 22:26:24 · 399 阅读 · 0 评论 -
[Java并发与多线程](四)线程优先级和守护线程线程终止方式
Java多线程之线程优先级和守护线程1、interrupt()说明2、线程优先级的示例3、守护线程的示例1、interrupt()说明java 中的线程优先级的范围是1~10,默认的优先级是5。高优先级线程会优先于低优先级线程执行。java 中有两种线程:用户线程和守护线程。可以通过isDaemon()方法来区别它们:如果返回false,则说明该线程是用户线程;否则就是守护线程。用户线程一...转载 2019-08-05 20:17:37 · 291 阅读 · 1 评论 -
[Java并发与多线程](五)Thread类和Object类中的重要方法详解
Java多线程之线程等待与唤醒1、wait(),notify(),notifyAll()等方法介绍2、wait()和notify()示例3、wait(long timeout)和notify()4、wait(long timeout)和notify()5、为什么notify(),wait()等函数定义在Object中,而不是Thread中1、wait(),notify(),notifyAll()...转载 2019-08-03 20:25:11 · 464 阅读 · 0 评论 -
[Java并发与多线程](六)线程休眠
Java多线程之线程休眠1、sleep()介绍2、sleep()示例3、sleep() 与 wait()的比较1、sleep()介绍sleep() 定义在Thread.java中。sleep()的作用是让当前线程休眠,即当前线程会从运行状态进入到休眠(阻塞)状态。sleep()会指定休眠时间,线程休眠的时间会大于/等于该休眠的时间;在现场重新被唤醒时,它会由阻塞状态变成就绪状态,从而等待cp...转载 2019-08-03 21:44:53 · 365 阅读 · 0 评论 -
[Java并发与多线程](七)join方法
Java多线程之join1、join()介绍2、join()源码分析(基于JDK1.8.0_191)3、join()示例1、join()介绍join() 定义在Thread.java中。join() 的作用:让主线程等待子线程结束之后才能继续运行。这句话可能有点晦涩,我们还是通过例子去理解:// 主线程public class Father extends Thread { pu...转载 2019-08-03 22:03:00 · 200 阅读 · 0 评论 -
[Java并发与多线程](八)线程让步
Java多线程之线程让步1、yield()介绍2、yield()示例3、yield() 与 wait()的比较1、yield()介绍yield()的作用是让步。它能然当前线程由运行状态进入到就绪状态,从而让其它具有相同优先级的等待线程获取执行权;但是,并不能保证在当前线程调用yield()之后,其它具有相同优先级的线程就一定能获得执行权;也有可能是当前线程又进入到运行状态继续执行!2、yie...转载 2019-08-03 21:19:33 · 197 阅读 · 0 评论 -
[Java并发与多线程](久)生产消费者问题
生产消费者问题线程1、生产/消费者模型2、生产/消费者实现1、生产/消费者模型生产/消费者问题是个非常典型的多线程问题,涉及到的对象包括生产者、消费者、仓库和产品。他们之间的关系如下:生产者仅仅在仓储未满时候生产,仓满则停止生产。消费者仅仅在仓库有产品时候才能消费,仓空则等待。当消费者发现仓库没产品可消费时候会通知生产者生产。生产者在生产出可消费产品时候,应该通知等待的消费者去消费。...转载 2019-08-05 20:25:01 · 285 阅读 · 0 评论 -
[Java并发与多线程](十)线程安全问题
Java多线程之线程安全问题1、线程安全1.1、什么是线程安全?1.2、什么情况下会出现线程安全问题,怎么避免?1.3、一共有哪几类线程安全问题?1.3.1、运行结果错误1.3.2、活跃性问题1.3.3、对象发布和初始化的时候的安全问题2、哪些场景需要额外注意线程安全问题?3、为什么多线程会带来性能问题?1、线程安全1.1、什么是线程安全?当多个线程访问一个对象时如果不用考虑这些线程在运行时环境下的调度和交替执行,也不需要进行额外的同步,或者在调用方进行任何其他的协调操作,调用这个对象的行文都可以获原创 2020-12-27 22:10:06 · 532 阅读 · 0 评论 -
[Java并发与多线程](十一)Java内存模型——底层原理
Java内存模型——底层原理1、底层原理2、三兄弟:JVM内存结构 VS Java内存模型 VS Java对象模型2.1、JVM内存结构:和Java虚拟机的运行时区域有关2.2、Java内存模型-JMM(*):和Java并发编程有关2.3、Java对象模型:和Java对象在虚拟机中的表现形式有关3、JMM是什么?3.1、什么是重排序?3.2、重排序的好处:提高处理速度3.3、 重排序的3种情况:编译器优化、CPU指令重排、内存的"重排序"3.4、可见性3.4.1、为什么会有可见性问题?3.4.2、JMM的抽原创 2020-12-28 22:21:45 · 311 阅读 · 0 评论 -
[Java并发与多线程](十二)死锁——从产生到消除
Java内存模型——底层原理1、死锁是什么?有什么危害?1.1、死锁的影响1.2、发生死锁的例子(*)1.3、实际生产中的例子-转账1.4、死锁发生的4个必要条件1.5、如何定位死锁2、修复死锁的策略2.1、线上发生死锁应该怎么办?2.2、常见修复策略2.2.1、哲学家就餐的换手方案2.2.2、死锁的检测与恢复策略2.2.3、实际工程中如何有效避免死锁3、其他活性故障3.1、活锁(LiveLock)3.2.1、工程中的活锁实例:消息队列3.2.2、如何解决活锁问题3.2、饥饿1、死锁是什么?有什么危害?原创 2020-12-29 21:15:01 · 377 阅读 · 0 评论 -
[Java并发与多线程](十三)线程池原理
线程池——治理线程的最大法宝1、线程池的自我介绍1、线程池的自我介绍原创 2021-01-04 23:39:38 · 288 阅读 · 0 评论 -
[Java并发与多线程](十四)线程池源码(上)
线程池源码1、ThreadPoolExecutor的工作状态1.1 工作状态概述1.2 分析一下线程池状态的标记原理1.3 工作状态的具体判定1.4 工作状态的转换2、ThreadPoolExecutor的重要成员变量2.1 构造方法2.2 线程工厂(ThreadFactory)2.3 拒绝策略(RejectedExecutionHandler)2.4 其他重要成员变量3、盘点一下常见的线程池3.1、FixedThreadPool3.2、SingleThreadPool3.3、CachedThreadPoo转载 2021-01-13 23:05:06 · 158 阅读 · 0 评论 -
[Java并发与多线程](十五)线程池源码(下)
线程池源码1、内部类-Worker1.1 基本属性1.2 构造方法1.3 对AQS相关方法的实现1.4 对线程的中断方法2、提交任务2.1、创建工作线程1、内部类-Worker1.1 基本属性重要的是thread(当前worker线程),firstTask(初始任务),completedTasks(任务计数器)。private final class Worker extends AbstractQueuedSynchronizer implements Runnab转载 2021-01-13 23:44:55 · 164 阅读 · 0 评论 -
[Java并发与多线程](十六)ThreadLocal
线程池——治理线程的最大法宝1、ThreadLocal1.1 两大使用场景——ThreadLocal的用途1.1 典型场景1:每个线程需要一个独享的对象1.2 典型场景2:每个线程内需要保存全局变量1.2 ThreadLocal方法1.3 ThreadLocal的两个作用1.4 使用ThreadLocal带来的好处1.5 ThreadLocal原理1.6 ThreadLocal主要方法介绍2、ThreadLocal注意点2.1 内存泄露2.2 如何避免内存泄露2.3 空指针异常2.4 共享对象1、Thre原创 2021-01-06 23:11:35 · 218 阅读 · 0 评论 -
[Java并发与多线程](十七)不可不说的“锁”事
线程池——治理线程的最大法宝1、Lock接口1.1 简介、地位、作用1.2 为什么synchronized不够用?为什么需要Lock?1.3 方法介绍1.3.1 lock()1.3.2 tryLock()1.3.3 tryLock(long time, TimeUnit unit)1.3.4 lockInterruptibly1.3.5 unlock()1.4 可见性保证2、锁的分类2.1 乐观锁和悲观锁(*)2.1.1 为什么会诞生非互斥同步锁(乐观锁)?—互斥同步锁(悲观锁)的劣势2.1.2 什么是乐观原创 2021-01-07 23:11:06 · 237 阅读 · 0 评论 -
[Java并发与多线程](十八)atomic包
atomic包【一刻也不能分割】1、什么是原子类,有什么作用?2、Atomic*基本类型原子类2.1 AtomicInteger:原子类3 Atomic*Array数组类型原子类4 Atomic*Reference引用类型原子类5、把普通变量升级为原子类,用AtomicIntegerFieldUpdater升级原有变量6、Adder累加器(*)6.1、代码演示6.2、LongAdder带来的改进和原理6.3、对比AtomicLong和LongAdder7、Accumulator累加器1、什么是原子类,有什原创 2021-01-09 20:11:15 · 305 阅读 · 0 评论 -
[Java并发与多线程](十九)CAS原理
CAS原理1、什么是CAS1.1、CAS的等价代码2、案例演示3、应用场景3.1、分析在Java中是如何利用CAS实现原子操作的?4、以AtomicInteger为例,分析在Java中是如何利用CAS实现原子操作的?4.1 getAndAdd方法4.2 Unsafe类4.3 AtomicInteger加载Unsafe工具,用来直接操作内存数据4.4 接下来继续看Unsafe的getAndAddInt方法的实现5、缺点1、什么是CAS先比较后操作,运用的场合一定是并发的,是一种思想,一种算法,用来实现线程原创 2021-01-09 20:20:49 · 282 阅读 · 0 评论 -
[Java并发与多线程](二十)以不变应万变:final关键字和不变性
以不变应万变:final关键字和不变性1、什么是不变性(Immutable)2、final的作用2.1、final3种用法:修饰变量、方法、类2.1.1 final修饰变量——三种变量2.1.2 final修饰方法2.1.3 final修饰类2.2 注意点3、不变性和final的关系4、把变量写在线程内部——栈封闭5、常见问题:真假美猴王1、什么是不变性(Immutable)如果对象在被创建后,状态就不能被修改,那么它就是不可变的;例子:person对象,age和name都不能在变;好处:具有不变性原创 2021-01-09 20:37:10 · 249 阅读 · 0 评论 -
[Java并发与多线程](二十一)并发容器
并发容器1、并发容器概览1.1、趣说集合类的历史————古老和过时的同步容器2、ConcurrentHashMap(*)2.1、磨刀不误砍柴工:Map简介2.2、为什么需要ConcurrentHashMap?2.3、九层之台,起于累土,罗马不是一天建成的:HashMap的分析2.4、JDK1.7的ConcurrentHashMap实现和分析2.5、JDK1.8的ConcurrentHashMap实现和分析2.6、对比JDK1.7和1.8的优缺点,为什么要把1.7的结构改成1.8的结构2.7 组合操作:Con原创 2021-01-09 21:10:13 · 279 阅读 · 0 评论 -
[Java并发与多线程](二十二)控制并发流程
控制并发流程1、什么是控制并发流程2、CountDownLatch到计时门闩2.1、CountDownLatch类的作用2.2、类的主要方法介绍2.3、两个典型用法3、Semaphore信号量3.1、信号量用法3.2、信号量代码演示3.2、信号量的特殊用法4、Condition接口(又称条件对象)4.1 代码演示4.1.1 普通示例4.1.2 用Condition实现生产者消费者模式5、CyclicBarrier循环栅栏5.1、可重用5.2、CyclicBarrier和CountDownLatch的区别1原创 2021-01-09 21:25:00 · 280 阅读 · 0 评论 -
[Java并发与多线程](二十一)AQS
AQS1、为什么需要AQS——AbstractQueuedSynchronizer2、AQS的比喻3、AQS的作用、重要性,地位4、AQS内部原理解析-AQS的三要素(*)5、应用实例、源码解析5.1、AQS在CountDownLatch的应用5.2、AQS在Semaphore的应用5.3、AQS在ReentrantLock的应用6、利用AQS实现一个自己的Latch门闩1、为什么需要AQS——AbstractQueuedSynchronizer1)、锁和协作类的共同点:闸门,ReentrantLock原创 2021-01-09 21:35:19 · 283 阅读 · 0 评论 -
[Java并发与多线程](二十一)获取子线程的执行结果(*)【来而不往非礼也】
Future和Callable——治理线程的第二大法宝1、Runnable的缺陷2、Callable接口3、Future类3.1、Future的主要方法:5个3.2、Future用法3.2.1 用法1:线程池的submit方法返回Future对象3.2.1.1 get的基本用法3.2.1.2 Callable的Lambda表达式形式3.2.1.3 多个任务,用Future数组来获取结果3.2.1.4 任务执行过程中抛出Exception和isDone展示3.2.1.5 获取任务超时3.2.2 用法2:用Fu原创 2021-01-09 21:47:24 · 613 阅读 · 0 评论 -
[Java并发与多线程](二十二)从0到1打造高性能缓存
从0到1打造高性能缓存1、从最简单版缓存入手——HashMap2、代码有重构空间——用装饰者模式3、性能待优化——引出锁性能优化经验:缩小锁的粒度4、用并发集合——ConcurrentHashMap5、避免重复计算——Future和Callable的妙用6、依然存在重复的可能——用原子操作putIfAbsent7、计算中抛出异常——ExecutionException8、缓存污染——计算失败则移除Future,增加健壮性9、缓存过期功能10、高并发访问时11、测试并发性能,所有线程同时访问缓存1、从最简单原创 2021-01-09 21:59:13 · 251 阅读 · 0 评论