Java多线程,并发核心知识体系总结
目录
Java底层原理:
线程终止——interrupt
线程安全——运算结果出错,
活跃性问题:死锁、活锁、饥饿锁,
对象发布和初始化的线程安全
Java三兄弟——JVM内存结构,Java内存模型,Java对象模型
原子性
volatile
线程安全
单例模型
死锁
活锁,饥饿锁
Java底层原理:
思维导图:https://naotu.baidu.com/file/07f437ff6bc3fa7939e171b00f133e17?token=6744a1c6ca6860a0
线程终止——interrupt
public class TestMyInterrupt implements Runnable {public static void main(String[] args) throws InterruptedException {Thread thread = new Thread(new TestMyInterrupt());thread.start();Thread.sleep(1000);thread.interrupt();}@Overridepublic void run() {while (true){ // 先再次判断,是否中断了if(Thread.currentThread().isInterrupted()){ System.out.println("线程中断");break;}reInterrupt();}}private void reInterrupt(){try {Thread.sleep(2000);} catch (InterruptedException e) { // 如果是阻塞时总断,需要用特定中断。// 此时异常的中断,会将清除中断信号,所以上方需要再次判断Thread.currentThread().interrupt();e.printStackTrace();}}
}
线程安全——运算结果出错,
活跃性问题:死锁、活锁、饥饿锁,
对象发布和初始化的线程安全
/*i++ 出现结果错误,多个线程操作时候,会将结果覆盖掉,*/
public class ThreadsError implements Runnable {static int index=0;public static void main(String[] args) throws InterruptedException {ThreadsError t1 = new ThreadsError();Thread thread1 = new Thread(t1);Thread thread2 = new Thread(t1);thread1.start();thread2.start();thread1.join();thread2.join();System.out.println(ThreadsError.index);}@Overridepublic void run() { //两个线程,进入run(),会有俩个 int i。正确结果应为 2000 ,但此时显示错误结果 1520for (int i = 0; i <1000 ; i++) { index++;}
// for (; index <1000 ; index++) { //正确做法,共享index
// index++;
// }}
}
Java三兄弟——JVM内存结构,Java内存模型,Java对象模型
思维导图:https://naotu.baidu.com/file/60a0bdcaca7c6b92fcc5f796fe6f6bc9?token=bcdbae34bb3b0533
// Java对象模型方法区: //类加载时生成 存放 1,类信息 2,静态变量,常量 3,永久引用 Static Object o1=new Object(); 4,常量池堆(heap): 存放: 1,实例对象 new Object();2,基本数据类型Java栈(Stack): //编译时生成,每个线程包含一个栈 存放:对象引用, Object object=
// Java内存模型 JMMJMM 是规范
重要部分:1,重排序,代码的实际执行顺序和Java文件中的代码顺序不一致,why出现: 编译器,cpu,内存,为了提高效率会打乱顺序2, 可见性,可见性问题指,操作同一个对象时,后面的B线程看不到A线程的操作why出现: CPU有多级缓存,A线程在本地内存,其他线程看不到3,原子性,一系列操作,要么全部执行,要么全部不执行Happens-Before: Happens-Before原则用来解决可见性问题动作A发生在动作B,B保证能看到A的操作
原子性
int a= 1;直接赋值是原子性操作。原子性+原子性!=原子性操作long double 是64位,在64位操作系统中是 原子性
在32位不是,因为 64会被分成 两个独立的32 进行修改
volatile
volatile : 是一种同步机制,比synchronize和Lock更轻量级本质是仅仅将值 flush 内存中,不会发生上下文切换开销很小,做不到synchronized的原子保护,作用: 可见性,禁止重排序不适用: i++ ,两个线程同时可见 ,仍可以出现 i=0 , 两次 i++ i++适用:1, boolean flag , 如果一个线程从始至终只被各个线程赋值,没有其他操作,可以用 volatile 代 替synchronized, 赋值是原子性,加上可见性,所以是线程安全。2, 触发器。
线程安全
线程安全:指多个线程访问同一个对象,不需要额外处理(像单线程一样,正常运行),称为线程安全3种线程安全:1 , 运行错误 如 i++;2, 活跃性问题: 死锁,活锁,饥饿锁3, 对象发布和初始化时候的线程安全多线程造成的性能问题:1,调度:上下文切换2,协作,内存同步
单例模型
/* 饥饿式, 线程安全,因为太饿了,所以在程序加载过程中,就生成了一个对象,
*/public class Singleton1 {private static final Singleton1 instance=new Singleton1();private Singleton1(){}public static Singleton1 getSingleton1(){return instance;}}
/*懒汉式 双重检查 + volatile 因为懒,所以用的时候才生成,但可能造成意外,线程安全*/
public class Singleton6 {private volatile static Singleton6 instance = null;private Singleton6(){} public static Singleton6 getInstance(){if(instance==null){synchronized (Singleton6.class){if(instance==null)instance=new Singleton6();}}return instance;}
}
/*枚举 简单,保证各种线程安全问题线程安全 */public enum Singleton8 {INSTACE;public void whatever(){}public static void main(String[] args) {Singleton8.INSTACE.whatever();}}
死锁
思维导图:https://naotu.baidu.com/file/ec7748c253f4fc9d88ac1cc1e47814f3?token=bb71b5895a747d67
死锁 : 当两个(或多个)线程相互持有对方所需要的资源,又不主动释放,导致阻塞无法运行,这就是死锁死锁影响:1,不同系统不一样,取决与不同系统对死锁的处理能力2, 数据库,自动处理,检测并放弃事务3, JVM,无法自动处理死锁必要条件:1,互斥性 :多个线程不能同时持有2,请求与保持条件 : 请求锁之后一直保持现有的资源3,不可剥夺条件 : 不能中断4,循环等待条件, : 线程出现了环路状况定位死锁:1,jstack : 命令行查看2, ThreadMXBean ,ThreadMXBean threadMXBean = ManagementFactory.getThreadMXBean();long[] deadlockedThreads = threadMXBean.findDeadlockedThreads();for (int i = 0; i <deadlockedThreads.length ; i++) {ThreadInfo threadInfo = threadMXBean.getThreadInfo(deadlockedThreads[i]);System.out.println("发现死锁+"+threadInfo.getThreadName());}
如何修复死锁:1,避免策略: 改变策略顺序,如 哲学家就餐问题,将一个顺序改为右手如 银行转账问题, 根据Hash值大小决定顺序2,检测与恢复策略:允许发生死锁,定期检测锁是否有环路1, 终止线程,2,资源抢占,将锁要回来,重新分配 3,鸵鸟策略 : 假装没看到问题实际开发过程中如何避免死锁1,多用并发类,而非同步类, ConcurrentHashMap,AtomicBoolean.
2,降低锁的粒度,用不同的锁,而非一个锁
3,尽量用同步块,而非同步方法,
4,给线程起名字,debug起来方便
5, 避免锁的嵌套
6,分配资源前,看能否收回
7,尽量不要几个功能用同一把锁,专锁专用
活锁,饥饿锁
活锁:没有阻塞,但是始终做着重复无用的事情饥饿锁:1,线程始终获取不到某些资源2,优先级太低,始终获取不到资源
Java多线程,并发核心知识体系总结相关推荐
- Java多线程并发编程知识体系(附大图-持续更新)
Java多线程体系 1.并发编程的优势 提升CPU资源利用率 提升吞吐量 提升程序响应速度 更好的编程模型 2.并发带来的问题 1.安全性问题 0.定义:什么是安全性问题 多线程读写共享变量时出现不正 ...
- Java并发核心知识体系精讲---死锁的前世今生
声明:本文是自己自学慕课网悟空老师的<Java并发核心知识体系精讲>的死锁部分后整理而成课程笔记. 课程链接如下:https://coding.imooc.com/class/362.ht ...
- 线程八大核心+java并发核心知识体系精讲_Java从业者如果不懂这些,面试80%都会挂在这些核心知识上面...
JVM 无论什么级别的Java从业者,JVM都是进阶时必须迈过的坎.不管是工作还是面试中,JVM都是必考题.如果不懂JVM的话,薪酬会非常吃亏(近70%的面试者挂在JVM上了) 详细介绍了JVM有关于 ...
- java并发核心知识体系精讲_JAVA核心知识汇总
双非同学如何逆袭大厂? 在互联网行业,入行的第一份工作很大程度上决定了以后职业发展的高度.有些双非的同学认为自己校招进不了大厂以后还会有社招,这种想法很危险.大厂的社招,大多数都只招大厂的员工.什么意 ...
- java并发核心知识体系精讲_JVM核心知识体系
作者:林振华 来源:编程原理 1.问题 如何理解类文件结构布局? 如何应用类加载器的工作原理进行将应用辗转腾挪? 热部署与热替换有何区别,如何隔离类冲突? JVM如何管理内存,有何内存淘汰机制? JV ...
- java并发核心知识体系精讲_Java 面试突击之 Java 并发知识基础 amp; 进阶考点全解析
版权说明:本文内容根据 github 开源项目整理所得 项目地址: https://github.com/Snailclimb/JavaGuidegithub.com 一.基础 什么是线程和进程? ...
- 《Java高并发核心编程.卷2,多线程、锁、JMM、JUC、高并发设计模式》
<Java高并发核心编程.卷2,多线程.锁.JMM.JUC.高并发设计模式> 目录 第1章 多线程原理与实战 1.2 无处不在的进程和线程 1.2.1 进程的基本原理 1.2.2 线程的基 ...
- Java尚硅谷核心知识
Java尚硅谷核心知识 一.Java基础部分 1.1 Java语言的主要特性 1.2 Java程序运行机制及运行过程 1.2.1Java两种核心机制 1.3Java语言的环境搭建 1.3.1 为什么要 ...
- Java 多线程 并发编程
转载自 Java 多线程 并发编程 一.多线程 1.操作系统有两个容易混淆的概念,进程和线程. 进程:一个计算机程序的运行实例,包含了需要执行的指令:有自己的独立地址空间,包含程序内容和数据:不同进 ...
最新文章
- 【采用】信用风险模型(申请评分、行为评分)与数据准备(违约期限、WOE转化)
- ZYNQ7000程序编译成功但烧写报错(使用Vitis2020.2)
- asterisk 互联
- LeetCode 468. 验证IP地址
- python清空集合_python集合删除多种方法详解
- 拳王虚拟项目公社:说一个合法正规兼职创业,副业虚拟资源项目
- 80-20-010-原理-字符编码-字符编码
- pytorch图像预处理
- 分分钟搞定阿里云私有Docke镜像仓库的搭建
- 数据可视化插件 echart
- CVS update常用技巧
- 2021年1月13日以后,如何用Flash Player打开swf文件
- java web学习心得
- ERP天思T8后台SQL批量查询多阶BOM(九层)
- 用K-Means聚类分析做客户分群
- java redis令牌桶_redis实现的简单令牌桶
- 4个关键,如何清晰的做好数据分析
- 发票OCR识别验真接口简介
- Tesseract-OCR5.0软件安装和语言包安装(Windows系统)
- 如何用计算机函数算年龄,农历虚龄计算器,岁数计算器怎么查对象生日日
热门文章
- 论证是一门学问 如何让你的观点有说服力-6 规则6 措辞前后一致
- C++程序设计的技巧-Pimple的使用
- 调用新浪网址缩短服务生成网址短链接
- 如何让技术大佬失去理智
- 一位大佬对学习哲理的思考
- Python语言特色集锦
- One Drive 回收站文件太多时无法清空回收站解决办法
- android vivo oppo 真机调试 apk、安装失败,系统老是报“解析包时出现问题”
- 模糊数学Fuzzy Set第2讲——Fuzzy Logic Fuzzy Reasoning
- Structure of a Google Docs document 谷歌文档的结构