多线程学习笔记"/>
java多线程学习笔记
需要学习的知识
多线程基础知识讲解
参考索隆和jim的视频,以及自己做的笔记
导读
为了充分利用CPU资源,人们发明了线程和进程
进程
由来:在单核cpu的时期,为了方便操作把一系列的操作的指令写下来,形成一个清单,一次性的交给计算机,这就是批处理系统。这样有很大的问题,在一个程序I/O操作时,cpu处于闲置状态,这样就浪费了cpu的性能
进程的由来总结:这要从硬件谈起,cpu 内存 硬盘 的速度不一样,而且I/O需要等待会耗费大量的时间,为了能更有效的利用cpu的性能
在I/O等待时执行其他程序。应运而出的产生了进程
进程是资源分配的最小单元,每启动一个进程,系统就会为它分配地址空间,建立数据表来维护代码段、堆栈段和数据段,这种操作是昂贵的。
程序从磁盘读入内存时,就是一个进程。
进程的灵魂就是PCB(进程控制块)
进程 = 程序 + PCB
PCB
Identifer 标识符
state 状态 为了进程调度
priority 优先级
pc 程序计数器
memory pointers 内存指针
context data 上下文数据 上下文就是存放 计算的临时结果(这里会存在多线程安全问题)
I/O status I/O状态
Accountry infomation 记账信息(统计硬件的信息)
线程
线程的由来(也就是有了进程为什么还会有线程):进程在一个时间内,只能干一件事,如果干两件事,那就无能为力了,进程在执行过程中如果有阻塞例如io,他整个进程就会挂起,即使有些进程不依赖于io,也将无法执行。
干两件事 可以用多个进程程解决,这样开销较大 涉及进程间的通信
进程间通信七种方式
管道,消息队列,共享内存,信号量,socket,信号,文件锁
进程让操作系统的并发成为可能,线程让进程内部的并发成为可能
每一个线程的灵魂就是一个TCB
**TCB **
线程id
栈(如同非线程系统上的进程栈,主要存放局部变量)
栈指针
程序计数器
通用目的计数器
条件码(waiting blocked runnable …)
线程和进程区别
1.总体来说线程是进程里的执行单元,同时是一个能够调度的实体
2.进程有自己的独立地址空间,每启动一个进程,系统就会为它分配地址空间,建立数据表来维护代码段、堆栈段和数据段,这种操作非常昂贵。而线程是共享进程中的数据的,使用相同的地址空间,因此CPU切换一个线程的花费远比进程要小很多,同时创建一个线程的开销也比进程要小很多
3.线程之间的通信更方便,同一进程下的线程共享全局变量、静态变量等数据,而进程之间的通信需要以通信的方式(IPC)进行。不过如何处理好同步与互斥是编写多线程程序的难点。
4.但是多进程程序更健壮,多线程程序只要有一个线程死掉,整个进程也死掉了,而一个进程死掉并不会对另外一个进程造成影响,因为进程有自己独立的地址空间
多线程的底层操作
并发和并行概念
并发(concurrent):同时拥有两个或多个线程,如果程序在单核处理器上运行,多个线程将交替地换入或者换出内存,这些线程是同时“存在“的,每个线程处于执行过程中的某个状态
并行(parallel):如果运行在多核处理器上,此时,程序的每个线程将分配到一个处理器核上,因此可以同时运行。
高并发:是互联网分布式系统架构设计中必须考虑的因素之一,它通常是指,通过设计能够同时并行处理很多请求
并发基础
cpu多级缓存
cpu缓存的意义
1)时间局部性:如果某个数据被访问,那么在不久的将来他很可能被再次访问
2)空间局部性:如果某个数据被访问,那么与他相邻的数据也可能很快被访问
cpu缓存一致性(MESI)
- 用于保证cpu cache之间缓存共享数据的一致
cpu多级缓存 - - 乱序执行优化
处理器为了提高运算速度而做出违背代码原有顺序的优化
Java内存模型(Java Memory Model,JMM)
由来:为了屏蔽硬件和操作系统内存访问差异,以实现java程序在各个平台下达到一致的并发效果,jvm规范中定义了JMM
JMM规范了JVM与计算机内存是怎么协作工作的,它规定了线程如何 和 何时看到由其他线程修改过的共享变量的值以及在必须时如何同步的访问共享变量
heap 中的数据是运行时动态分配内存的,比较慢。
stack 栈中的数据大小和周期是有规定的,缺乏灵活性。
引用存在在栈中,对象本身存在堆中。
如果两个线程同时调用同一个对象的同一个方法,他们都要访问这个对象成员变量,每个线程都拥有这个对象的私有拷贝
Java内存模型-同步操作与规则
并发的优势与风险
更多推荐
java多线程学习笔记
发布评论