多线程相关知识梳理

相关资料:

十分钟带你深入了解多线程——多线程关于锁的优化(一)_多线程如何使用锁使程序高效_桃花键神的博客-CSDN博客技术分享 | 隔离级别:正确理解幻读 - 知乎

DDIA 逐章精读

15-445-Lec16-两阶段锁 - 知乎

两阶段锁的证明 - 知乎

深入分析MySQL行锁加锁规则_supremum pseudo-record_qq_39745899的博客-CSDN博客

黑马程序员深入学习Java并发编程,JUC并发编程全套教程_哔哩哔哩_bilibili

问题总结

什么是进程?什么是线程?进程与线程有什么区别?

1、进程是资源分配的最小单位,线程是程序执行的最小单位(资源调度的最小单位)
2、进程有自己的独立地址空间,每启动一个进程,系统就会为它分配地址空间,建立数据表来维护代码段、堆栈段和数据段,这种操作非常昂贵。
而线程是共享进程中的数据的,使用相同的地址空间,因此CPU切换一个线程的花费远比进程要小很多,同时创建一个线程的开销也比进程要小很多。
3、线程之间的通信更方便,同一进程下的线程共享全局变量、静态变量等数据,而进程之间的通信需要以通信的方式(IPC)进行。

进程的通信方式是什么?线程的通信方式是什么?

进程通信方式

1.管道

缺点:

a.同步通信,如果数据没有被读取,写进程会一直阻塞。

b.以字节流形式传递数据,要等所有数据写入完毕才可以读取。

c.数据单向传输。

2.消息队列

优点:

a.发送方和接收方以某种约定的数据格式传输数据,将数据封装成数据单元,可以边写边读。

b.异步通信,写进程写入完成后即可做其他事情。

缺点:

a.写数据时会发生用户空间到内核空间的数据拷贝,读数据时会发生内核空间到用户空间的数据拷贝。

3.共享内存

优点:避免用户空间和内核空间的数据拷贝。

缺点:存在多进程访问共享变量的并发问题。

4.信号量

优点:解决了共享内存的并发问题,当信号量对进程数限制为1时,等同于互斥锁。

5.socket

Socket 是 TCP/IP 协议中应用层和传输层之间的一个抽象层,它把TCP/IP协议族复杂的操作抽象为几个简单的接口供应用层调用,从而实现进程在网络中通信。可以用于网络通信,也可以用于本地进程间通信。

线程通信的方式

共享内存式:synchronized,volatile

消息通知式:wait/notify机制,join方法,await/signal机制

JVM内存模型

https://www.cnblogs.com/mikechenshare/p/16562589.html

方法区,虚拟机栈,本地方法栈,堆区,程序计数器

方法区:类型信息,包括类信息(完整有效名-包名+类名,直接父类,直接实现接口,类修饰符),变量信息(变量名,变量修饰符,变量类型), 方法信息(方法名,返回类型,方法修饰符,方法字节码),1.8之后改名为元数据区。常量池。可以抛出内存溢出异常。

虚拟机栈:每个线程在创建时都会创建一个虚拟机栈,其内部保存一个个的栈帧(Stack Frame),对应着一次次的Java方法调用。栈帧用来存放java方法执行期间的局部变量表、操作数栈、动态链接、方法返回地址等数据。每一个栈帧就是一个方法的相关数据。虚拟机栈是线程私有的,可以抛出栈溢出异常和内存溢出异常。

本地方法栈:除了方法类型为native外,其余性质与虚拟机栈相同

堆区:用来存放对象和数组,是不同线程的公共访问区域。堆区分为新生代,老年代。其中新生代又分为eden, from survivor, to suvivor三个区域。可以抛出内存溢出异常

程序计数器:记录的是正在执行的JVM字节码指令的地址,每个线程有自己独立的程序计数器,在获取CPU时间片后,能恢复到正确的执行位置。

关于堆区,方法区,永久代,元空间之间关系的说明

方法区的Class信息,又称为永久代,是否属于Java堆? - 知乎

堆区,方法区属于逻辑划分的概念,定义来源于JVM规范

永久代是java8之前,hotspot虚拟机对于方法区的实现方式。在物理内存上来说,永久代属于堆空间,上面也会发生垃圾收集。

元空间是java8之后,hotspot虚拟机对于方法区的实现方式。在物理内存上来说,元空间不属于堆空间,而是本地内存。

线程的状态转换模型

操作系统层面的的五态模型

【初始状态】仅是在语言层面创建了线程对象,还未与操作系统线程关联 【可运行状态】(就绪状态)指该线程已经被创建(与操作系统线程关联),可以由 CPU 调度执行 【运行状态】指获取了 CPU 时间片运行中的状态 当 CPU 时间片用完,会从【运行状态】转换至【可运行状态】,会导致线程的上下文切换 【阻塞状态】 如果调用了阻塞 API,如 BIO 读写文件,这时该线程实际不会用到 CPU,会导致线程上下文切换,进入 【阻塞状态】 等 BIO 操作完毕,会由操作系统唤醒阻塞的线程,转换至【可运行状态】 与【可运行状态】的区别是,对【阻塞状态】的线程来说只要它们一直不唤醒,调度器就一直不会考虑 调度它们 【终止状态】表示线程已经执行完毕,生命周期已经结束,不会再转换为其它状态

java api层面的六态模型

 NEW 线程刚被创建,但是还没有调用 start() 方法 RUNNABLE 当调用了 start() 方法之后,注意,Java API 层面的 RUNNABLE 状态涵盖了 操作系统 层面的 【可运行状态】、【运行状态】和【阻塞状态】(由于 BIO 导致的线程阻塞,在 Java 里无法区分,仍然认为 是可运行) BLOCKED , WAITING , TIMED_WAITING 都是 Java API 层面对【阻塞状态】的细分,后面会在状态转换一节 详述 TERMINATED 当线程代码运行结束

锁升级机制

7000+字图文并茂解带你深入理解java锁升级的每个细节 - 知乎

 https://www.cnblogs.com/banmei-brandy/p/12299655.html

位运算符之左移和右移 - 知乎

死磕Synchronized底层实现--概论 · Issue #12 · farmerjohngit/myblog · GitHub

docs/Lock.md · wusong/interviewGuide - Gitee.com

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值