目录
第一章:
多线程概念:
1.线程就是独立的执行概念。在程序执行时,即时没有自身创建线程,后台也会存在多个线程,例如gc,主线程等,其中主线程是指main(),是系统的入口点,用于执行整个程序。
2.在一个进程中,如果开辟了多个线程,线程的运行由调度器安排调度,调度器是与操作系统紧密相关的,先后顺序不能认为干预。
3.对同一份资源操作时,会存在资源抢夺问题,需要加入并发控制。
4.线程会带来额外的开销,例如cpu的调度时间,并发控制等。
5.每个线程在自己的工作内存交互、加载和存储,主内存控制不当会导致数据不一致。
进程:
在操作系统中,运行的程序就是进程,一个进程可以包含多个线程。
创建线程:
第一种:
将一个类生命为Thread的子类,子类重写run方法,然后可以分配并通过start方法启动子类的实例。
第二种:
实现Runnable接口,重写run方法,然后可以分配类的实例,在创建Thread时作为参数传递,new Thread(p).start()来启动。
使用Runnable的好处有避免了单继承局限,又可以更方便地共享资源。
(了解)实现Callable接口来实现多线程:
初识静态代理:
Lambda:
线程状态:
线程在它的生命周期中,共有五个状态:新生、就绪、运行、阻塞、死亡。
线程进入阻塞状态后要想再运行会先进入就绪转台,而不是直接进行运行转台。线程死亡之后就没有了,没法再次就绪运行。
进行就绪状态的四种情况:1.start()方法。2.阻塞状态解除。3.运行过程中调用了yield方法。4.jvm原因,cpu将本地线程切换到其他线程等。
进入阻塞状态的四种情况:1.sleep()方法。2.wait()方法。3.join。4.例如read、write等IO操作。
进入死亡状态的两种情况:1.代码正常执行完毕。2.强制结束,例如stop(),destroy()。
线程的停止:
线程的暂停状态:
多线程的“礼让”yield,也是多线程的暂停:
让cpu调度器重新调度,避免占用太多资源。他是暂停进程,直接进入就绪状态,不是阻塞状态。
join合并线程:
观察线程的状态:
线程的优先级:
设置优先级,但是不是绝对的执行顺序,优先级低的也有可能先执行,是一个概率问题。
线程的分类(用户进程、守护进程):
线程分为用户进程和守护进程。虚拟机必须确保用户进程执行完毕,而不用等待守护进程执行完毕,守护进程例如后台记录操作日志等。
线程的常用方法:
并发:
并发是指同一个对象,多个线程同时操作。线程不安全很容易照成问题。
线程同步:
线程安全:
同步块:
死锁:
多个线程各自占有一些共享资源,并且互相等待其他线程占有的资源才能进行,这导致两个或者多个线程相互等待对方释放资源,都停止进行的情形。某一个同步块同时拥有“两个以上对象的锁”,就可能会发生“死锁”问题。
生产者消费者模式:
生产者消费者实现方式一之管程法:
分为四个角色:1.生产者;2.消费者;3.缓冲区;4.数据。
生产者消费者实现方式二之信号灯法:
任务的定时调度:
任务调度器:
指令重排:
volatile:
初识单例模式:
在多线程环境下,对外存在一个对象,1.构造器私有化,避免外部new构造器。2.提供私有的静态属性用于存储对象的地址。3.提供公共的静态方法来获取第二步的属性。
ThreadLocal:
分析ThreadLocal的上下文:
InheritableThreadLocal:
是ThreadLocal的子类,继承上下文环境的数据。会拷贝一份对应数据给子线程,不是直接共享,子线程改了之后不影响主线程了