一、进程和线程
1、概念
进程:操作系统进行资源分配的最小单位,资源包括:cpu、内存、io
线程:程序运行的最小单位
2、区别
线程切换效率更高,所以对于java项目的开发,一般多是多线程
二、CPU时间片轮转机制
1、概念
cpu会把运行的时间分割成时间片,对于单核多线程来说,每个线程都会占用自己的时间片,当时间片用完之后,该线程挂起,然后切换下次个线程,以此往复。
2、现象
正是因为cpu时间片轮转机制的存在,所以就算是单核的cpu,也可以实现多线程。
三、并行和并发
1、概念
并行:多个任务同时进行
并发:单位时间内,并发量的多少,多个任务交替着执行
四、并发编程的好处
1、实现了资源的高效利用
2、加快了用户的响应速度
3、实现了模块的模块化
五、中断
1、背景
由于使用stop方法停止线程非常暴力,可能会导致一系列问题。因此,提出一种温和的方式:请求另外一个先不要在执行了,这就是中断方式
2、interrupt()、isInterrupted()、interrupted()
interrupt():中断调用该方法的线程
isInterrupted():检测调用该方法的线程是否被中断,中断状态不会被清除。
interrupted():检测当前线程是否被中断,并且中断状态会被清除(即重置为false),此方法是警惕方法
六、join方法
将指定的线程加入到当前线程,实现线程的顺序执行
七、Threadlocal
1、概念
threadlocal提供了对象的副本,实现了隔离性。synchronized通过锁机制实现了了同一时间只能有一个线程访问同一对象
2.实现原理
1、获取当前的线程对象
2、通过当前线程对象获取对象属threadlocals(其实是一个threadlocalmap(key为threadlocal,value值为副本))
3、通过get()/set()/remove()方法能够对threadlocalmap中key值为null的value值进行清除
4、当该副本不使用时,挑用remove()方法进行资源的释放,防止内存泄露,甚至内存溢出
注意:threadlocalmap中的key为弱类型,当gc进行拉进回收的时候,key被回收。当下次调用get()/set()/remove()方法时,会自动清理key为null的value。如此一来,value也能被回收了,防止出现内存泄露
参考文档:https://blog.youkuaiyun.com/puppylpg/article/details/80433271
八、wait和notify
等待通知的标准范式:
等待方遵循的原则:
synchronized(对象){
while(满足的条件){
对象.wait();
}
对应的逻辑处理
}
通知方遵循的原则:
synchronized(对象){
条件改变
对象.notifyAll;
}