目录

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多线程,并发核心知识体系总结相关推荐

  1. Java多线程并发编程知识体系(附大图-持续更新)

    Java多线程体系 1.并发编程的优势 提升CPU资源利用率 提升吞吐量 提升程序响应速度 更好的编程模型 2.并发带来的问题 1.安全性问题 0.定义:什么是安全性问题 多线程读写共享变量时出现不正 ...

  2. Java并发核心知识体系精讲---死锁的前世今生

    声明:本文是自己自学慕课网悟空老师的<Java并发核心知识体系精讲>的死锁部分后整理而成课程笔记. 课程链接如下:https://coding.imooc.com/class/362.ht ...

  3. 线程八大核心+java并发核心知识体系精讲_Java从业者如果不懂这些,面试80%都会挂在这些核心知识上面...

    JVM 无论什么级别的Java从业者,JVM都是进阶时必须迈过的坎.不管是工作还是面试中,JVM都是必考题.如果不懂JVM的话,薪酬会非常吃亏(近70%的面试者挂在JVM上了) 详细介绍了JVM有关于 ...

  4. java并发核心知识体系精讲_JAVA核心知识汇总

    双非同学如何逆袭大厂? 在互联网行业,入行的第一份工作很大程度上决定了以后职业发展的高度.有些双非的同学认为自己校招进不了大厂以后还会有社招,这种想法很危险.大厂的社招,大多数都只招大厂的员工.什么意 ...

  5. java并发核心知识体系精讲_JVM核心知识体系

    作者:林振华 来源:编程原理 1.问题 如何理解类文件结构布局? 如何应用类加载器的工作原理进行将应用辗转腾挪? 热部署与热替换有何区别,如何隔离类冲突? JVM如何管理内存,有何内存淘汰机制? JV ...

  6. java并发核心知识体系精讲_Java 面试突击之 Java 并发知识基础 amp; 进阶考点全解析

    版权说明:本文内容根据 github 开源项目整理所得 项目地址: https://github.com/Snailclimb/JavaGuide​github.com 一.基础 什么是线程和进程? ...

  7. 《Java高并发核心编程.卷2,多线程、锁、JMM、JUC、高并发设计模式》

    <Java高并发核心编程.卷2,多线程.锁.JMM.JUC.高并发设计模式> 目录 第1章 多线程原理与实战 1.2 无处不在的进程和线程 1.2.1 进程的基本原理 1.2.2 线程的基 ...

  8. Java尚硅谷核心知识

    Java尚硅谷核心知识 一.Java基础部分 1.1 Java语言的主要特性 1.2 Java程序运行机制及运行过程 1.2.1Java两种核心机制 1.3Java语言的环境搭建 1.3.1 为什么要 ...

  9. Java 多线程 并发编程

    转载自  Java 多线程 并发编程 一.多线程 1.操作系统有两个容易混淆的概念,进程和线程. 进程:一个计算机程序的运行实例,包含了需要执行的指令:有自己的独立地址空间,包含程序内容和数据:不同进 ...

最新文章

  1. 【采用】信用风险模型(申请评分、行为评分)与数据准备(违约期限、WOE转化)
  2. ZYNQ7000程序编译成功但烧写报错(使用Vitis2020.2)
  3. asterisk 互联
  4. LeetCode 468. 验证IP地址
  5. python清空集合_python集合删除多种方法详解
  6. 拳王虚拟项目公社:说一个合法正规兼职创业,副业虚拟资源项目
  7. 80-20-010-原理-字符编码-字符编码
  8. pytorch图像预处理
  9. 分分钟搞定阿里云私有Docke镜像仓库的搭建
  10. 数据可视化插件 echart
  11. CVS update常用技巧
  12. 2021年1月13日以后,如何用Flash Player打开swf文件
  13. java web学习心得
  14. ERP天思T8后台SQL批量查询多阶BOM(九层)
  15. 用K-Means聚类分析做客户分群
  16. java redis令牌桶_redis实现的简单令牌桶
  17. 4个关键,如何清晰的做好数据分析
  18. 发票OCR识别验真接口简介
  19. Tesseract-OCR5.0软件安装和语言包安装(Windows系统)
  20. 如何用计算机函数算年龄,农历虚龄计算器,岁数计算器怎么查对象生日日

热门文章

  1. 论证是一门学问 如何让你的观点有说服力-6 规则6 措辞前后一致
  2. C++程序设计的技巧-Pimple的使用
  3. 调用新浪网址缩短服务生成网址短链接
  4. 如何让技术大佬失去理智
  5. 一位大佬对学习哲理的思考
  6. Python语言特色集锦
  7. One Drive 回收站文件太多时无法清空回收站解决办法
  8. android vivo oppo 真机调试 apk、安装失败,系统老是报“解析包时出现问题”
  9. 模糊数学Fuzzy Set第2讲——Fuzzy Logic Fuzzy Reasoning
  10. Structure of a Google Docs document 谷歌文档的结构