
深入浅出Java并发多线程
深入浅出Java并发多线程
核心基础+内存模型+死锁
Venlenter
这个作者很懒,什么都没留下…
展开
-
第十四章、 总结与展望
1、面试高频考点1、有多少种实现线程的方法?典型错误答案和正确答案 2、实现Runnable接口和继承Thread类哪种方式更好? 3、一个线程两次调用start()方法会出现什么情况?为什么? 4、既然start()方法会调用run()方法,为什么我们选择调用start()方法,而不是直接调用run()方法呢? 5、如何正确停止一个线程? 6、如何处理不可中断的阻塞(例如抢锁时ReentrantLock.lock()或Socket I/O时无法响应中断,那应该怎么让该线程停止呢?) 7、线原创 2020-06-29 14:23:49 · 279 阅读 · 0 评论 -
第十三章、 并发死锁问题与企业级解决方案(死锁、活锁、饥饿)
1、死锁是什么?有什么危害?1.1 什么是死锁?发生在【并发】中 【互不相让】:当两个(或更多)线程(或进程)相互持有对方所需要的资源,又不主动释放,导致所有人都无法继续前进,导致程序陷入无尽的阻塞,这就是死锁。 多个线程造成死锁的情况(A->B->C->A)1.2 死锁的影响死锁的影响在不同系统中是不一样的,这取决于系统对死锁的处理能力数据库中:检测到死锁,(两个事务AB相互竞争),会放弃其中一个事务A,让B先执行,然后再执行A JVM中:无法自动处理1.3 .原创 2020-06-29 14:07:01 · 510 阅读 · 0 评论 -
第十二章、 Java内存模型JMM——底层原理
1、到底什么叫“底层原理”?本章研究的内容是什么?1.1 从Java代码到CPU指令①最开始,我们编写的Java代码,是*.java文件②在编译(javac命令)后,从刚才的*.java文件会变出一个新的Java字节码文件(*.class)③JVM会执行刚才生成的字节码文件(*.class),并把字节码文件转化为机器指令④机器指令可以直接在CPU上运行,也就是最终的程序执行1.2 JVM实现会带来不同的“翻译”,不同的CPU平台的机器指令又千差万别,无法保证并发安全的效果一致1.原创 2020-06-29 10:42:34 · 522 阅读 · 1 评论 -
第十一章、 多线程的八大核心总结
1、八大核心面试问题总结有多少种实现线程的方法?思路有5点 实现Runnable接口和继承Thread类哪种方式更好? 一个线程两次调用start()方法会出现什么情况?为什么? 既然start()方法会调用run()方法,为什么我们选择调用start()方法,而不是直接调用run()方法呢? 如何停止线程 如何处理不可中断的阻塞 线程有哪几种状态?生命周期是什么? 用程序实现两个线程交替打印0~100的奇偶数 手写生产者消费者设计模式 为什么wait()需要在同步代码块内使用,而sl原创 2020-06-29 09:48:33 · 439 阅读 · 0 评论 -
第十章、核心8:线程安全-多线程会导致的问题
1、线程安全1.1 什么是线程安全当多个线程访问一个对象时,如果不用考虑这些线程在运行时环境下的调度和交替执行,也不需要进行额外的同步,或者在调用方进行任何其他的协调操作,调用这个对象的行为都可以获得正确的结果,那这个对象是线程安全的————《Java并发编程实战》1.2 线程不安全:get同时set全都线程安全?:运行速度、设计成本、trade off 完全不用于多线程的代码:不过度设计1.3 什么情况下会出现线程安全问题,怎么避免?1.3.1 运行结果错误:a++多线程下出现消失的原创 2020-06-29 09:36:59 · 1214 阅读 · 0 评论 -
第九章、核心7:线程异常处理(全局异常处理UncaughtExceptionHandler)
线程的未捕获异常UncaughtException应该如何处理?1、为什么需要UncaughtExceptionHandler?主线程可以轻松发现异常,子线程却不行 子线程异常无法用传统方法(try-catch)捕获(类似main方法中执行thread.start,抛出异常是在子线程的run中,而try-catch的是主线程main,所以捕获不到) 不能直接捕获会导致一些后果(无法捕获到异常,做相应的重试操作逻辑)2、两种解决方案方案一(不推荐):手动在每个run方法里进行try catch原创 2020-06-28 23:15:57 · 577 阅读 · 0 评论 -
第八章、核心6:线程各属性
1、线程各属性纵览属性名称 用户 编号(ID) 每个线程有自己的ID,用于标识不同的线程 名称(Name) 作用让用户或程序员在开发、调试或运行过程中,更容易区分每个不同的线程、定位问题等 是否是守护线程(isDaemon) true代表该线程是【守护线程】,false代表线程是非守护线程,也就是【用户线程】 优先级(Priority) 优先级这个属性的目的是告诉线程调度器,用户希望哪些线程相对多运行、哪些少运行 2、线程ID/** * Id原创 2020-06-28 23:10:39 · 228 阅读 · 0 评论 -
第七章、核心5:Thread和Object类中线程相关方法(wait/notify、sleep、join、yield)
1、方法概览类 方法名 简介 Thread sleep相关 本表格的“相关”,指的是重载方法,如sleep有多个重载方法,但实际作用大同小异 . join 主线程等待ThreaA执行完毕(ThreadA.join()) . yield相关 放弃已经获取到的CPU资源 . currentThread 获取当前执行线程的引用 . start,run相关 启动线程相关 . interrupt相关 ...原创 2020-06-28 22:59:29 · 416 阅读 · 0 评论 -
第六章、核心4:图解线程生命周期
1、有哪6种状态?2、每个状态是什么含义?New:新建还未执行(start()) Runnable(可运行的):调用了start方法后,就会变为Runnable状态 Blocked:进入synchronized修饰的区域,同时锁被其他线程拿走 Waiting:只能手工唤醒 Timed Waiting:计时等待。等到固定time时间后,就可以被唤醒;或者通过手工唤醒2种方式都可以 Terminated:程序正常执行完毕;或者出现没有被捕获的异常,中止了run方法3、状态间的转化图示原创 2020-06-28 22:07:28 · 239 阅读 · 0 评论 -
第五章、核心3:线程停止、中断之最佳实践
1、原理介绍:使用interrupt来通知,而不是强制interrupt是中断,A线程通知B线程去中断,而B线程是具有主动权的。B线程何时停止是B线程自己决定的,可能根据当前业务逻辑完成情况,所以说是通知,而不是强制2、停止线程的最佳实践2.1、通常线程会在什么情况下停止run方法的所有代码都执行完毕了 有异常出现且没有捕获2.2、正确的停止方法:interrupt2.2.1、普通情况下停止线程thread.interrupt通知,同时在thread的run方法中对interr..原创 2020-06-28 21:51:10 · 324 阅读 · 0 评论 -
第四章、核心2:开启多线程启动的世界(start与run的区别)
1、start()和run()的比较/** * StartAndRunMethod * * @author venlenter * @Description: 对比start和run两种启动线程的方法 * @since unknown, 2020-03-29 */public class StartAndRunMethod { public static void main(String[] args) { Runnable runnable = () ->原创 2020-06-28 21:27:22 · 264 阅读 · 0 评论 -
第三章、 核心1:实现多线程的正确姿势
1、实现多线程的方法是1种,2种还是4种?Oracle官网的文档是如何写的?方法一:实现Runnable接口 方法二:继承Thread类1.1 实现示例实现Runnable接口/** * RunnableStyle * * @author venlenter * @Description: 用Runnable方式创建线程 * @since unknown, 2020-03-23 */public class RunnableStyle implements Runnable原创 2020-06-21 23:38:44 · 234 阅读 · 0 评论 -
第二章、线程八大核心基础知识
原创 2020-06-21 23:08:00 · 277 阅读 · 0 评论