这几次学习的部分内容好多啊 还感觉难难的🚹,结合之前内容感觉绕绕的 所以这次笔记内容加点颜色,看起来活泼点(但感觉这样看有点乱,不简洁大方 🤭)
一、进程和线程
1.线程:是进程中的单个顺序控制流,是一条执行路径
单线程:一个进程如果只有一个执行路径,则称为单线程序
多线程:一个进程如果有多条执行路径,则称为多线程程序
2.进程:是正在运行的软件
独立性:能独立运行的基本单位,同时也是系统分配资源和调度的独立单位
和 动态性:实质是程序的一次执行过程,进程是动态产生,动态消亡的
和 并发性:任何进程都可以同其他进程一起并发执行
二、并发和并行
并发:在同一时刻,有多个指令在单个CPU上交替执行
并行:在同一时刻,有多个指令在多个CPU上同时执行
三、多线程
1.多线程是指从软件或硬件上实现多个线程并发执行的技术
2.多线程三个实现方法:
继承Thread类
实现Runnable接口
利用Callable和Future接口(这个最后要调用get方法,才可获取线程结束之后的结果)
3.线程生命周期:
4.多线程执行 安全问题
多线程操作共享数据 :
a 通过JAVA提供的同步代码块解决:synchronized(任意对象){多条语句操作共享数据的代码}
synchronized(this)锁的是调用该代码块的当前对象(不能保证线程安全)
synchronized(xxx.class)是对当前类上锁,不管是不是同一线程,只要是该类的对象,就会被上锁同步
b 通过 同步方法:把synchronized关键字加到方法上
(1)格式(注意要把休眠时间放到锁之前): 修饰符 synchronized 返回值类型 方法名(方法参数){}
同步方法的锁对象:this 当前实例对象
(2)同步代码块和同步方法的区别:
同步代码块可以锁住指定代码,同步方法是锁住方法中的所有代码
同步代码块可以指定锁对象,二同步方法不能指定锁对象
(3)同步静态方法:把synchronized关键字加到静态方法上
格式:修饰符 static synchronized 返回值类型 方法名(方法参数){}
同步静态方法的锁对象: 类名.class
c Lock锁:Lock实现提供比使用synchronized方法和语句可以获得更广泛的锁定操作
void lock() :获得锁
void unlock() :释放锁 (放到finally里面释放锁)
5.死锁:
线程死锁是指由于两个或者多个线程互相持有对方所需要的资源,导致这些线程处于等待状态,无法前往执行
6.生产者和消费者模型
等待:void wait ()
唤醒:void notify()(单个)
void notifyAll() (多个)