2022-08-03 第六组 刘明延 学习笔记
作者:互联网
/** 进程:运行中的程序
* 启动一个进程,操作系统就会为该进程分配内存空间
* 关掉进程,就释放内存
*
* 线程:进程的一个实体,由进程创建,也可以创建线程
* 一个进程可以有多个线程
*
* 并发:同一时刻,多个任务交替执行,"貌似同时",单核cpu实现的就是并发
* 并行:同一时刻,多个任务同时执行,多核cpu可以实现并行
*
* 创建线程的两个方法:
* 1.继承Thread,重写run方法
* 2.实现Runnable接口,
* 3.实现Callable接口
*
* 线程名=Thread.currentThread().getName()
*
* !!!真正实现多线程效果的,是start0(),底层是c/c++实现,只有JVM才能调用,start0()在start()方法中
*
* 只有native能控制cpu
* 调用start0方法后,该线程并不一定立即执行,只是将线程变成了可运行状态,具体什么时候运行,取决于cpu,由cpu统一调度
*
* 守护线程:
* Java中提供两种类型1的线程,
* 1.用户线程
* 2.守护程序线程
*
* 守护线程是为用户线程提供服务的,仅在用户线程运行时才需要
*
* 主方法可以理解为用户线程
* 守护线程对于后台支持任务非常有用
* 如:垃圾回收,大多数JVM线程都是守护线程
*
* 主程序就是用户线程,聊天窗口就是守护线程
* 创建守护线程
*
* 在主方法内启动的任何线程默认都是守护线程
*
* 线程的生命周期
* 从摇篮到坟墓
* NEW:这个状态主要是线程未被start()调用执行
* RUNNABLE:线程正在JVM中被执行,等待来自操作系统的调度
* BLOCKED:阻塞,因为某些原因,不能立即执行,需要挂起等待
* WAITING:无限期等待。Object类。如果没有被唤醒,则一直等待
* TIMED_WAITING:有限期等待,线程等待一个指定的时间
* TERMINATED:终止线程的状态,线程已经执行完毕
*
* 等待和阻塞有点像,阻塞是因为外部原因,等待一般是主动调用方法,发起主动的等待,等待可以传入参数,确定等待时间
*
* 同步代码块
* synchronized(对象){//得到对象的锁,才能操作同步代码
* //需要被同步代码
* }
* synchronized还可以放在方法声明中,表示整个方法-为同步方法
* public synchronized void m(String name){
* //需要被同步的代码
* }
*
* CPU多核缓存结构
* 物理内存:硬盘内存 (固态硬盘, 尽量不要选择混合硬盘)
* CPU缓存为了提高程序运行的性能,现在CPU在很多方面对程序进行优化
* CPU处理速度最快,内存次之(不安全),硬盘速度最慢(最安全稳定)
* 在CPU处理内存数据时,如果内存运行速度太慢就会拖累CPU
* 为了解决这样的问题,CPU设计了多级的缓存策略
*
* CPU分为三级缓存,每个CPU都有L1,L2缓存,但是L3缓存时多核公用的
* CPU在查找数据时,CPU->L1->L2->L3->内存->硬盘
* 从CPU到内存,大概要60-80纳秒
* 从CPU到L3,15纳秒
* 从CPU到L2,3纳秒
* 从CPU到L1,1纳秒
* 寄存器,0.3纳秒
* 进一步优化,CPU每次读取一个数据,也读取与它相邻的64个字节的数据
* 【缓存行】
*
* 英特尔提出了一个协议
* 1.修改态,此缓存被动过,内容与主内存不同,为此缓存专有
* 2.专有态,此缓存与主内存一致,但是其他CPU中没有
* 3.共享态,此缓存与主内存一致,其他的缓存也有
* 4.无效态,此缓存无效,需要从主缓存中重新读取
*
* 【指令重排】
* 四条指令,让四个人在四张纸上写下【恭喜发财】,一人一个字,谁先写完就加载,都加载后再排序
*
* Java内存模型-JMM
* 尽量做到硬件和操作系统之间打到一致的访问效果
*
* interrupt:中断线程,包括休眠
* setPriority:更改线程的优先级
学习心得:今天内容不好理解,多线程是最难学的部分,所以要多花时间了解概念和代码
学习感受:和之前的内容结合起来用有难度,尤其是学的东西越来越多,以前的内容变得更重要,必须用更多时间去复习
标签:03,缓存,刘明延,08,线程,内存,等待,CPU,守护 来源: https://www.cnblogs.com/dsofjsdo/p/16545688.html