- 线程生命周期
New
Runnable
Waiting
Timed Waiting
Dead - 多线程如何实现?
1.继承Thread类,重写run方法
extends Thread;
2.实现Runnable接口,重写run方法,实现Runnable接口的实现类的实例对象作为Thread构造函数的target
implements Runnable
3.通过Callable和FutureTask创建线程
implements Callable
4.通过线程池创建线程 - Priority
range 1~10
5 is default value - 什么是同步异步
同步(银行的转账系统),是所有的操作都做完,才返回给用户结果;即写完数据库之后,在相应用户,用户体验不好。
异步(大量的数据库操作),不用等所有操作等做完,就相应用户请求;即先相应用户请求,然后慢慢去写数据库,用户体验较好。 - join
确保某一线程执行完毕后才可继续执行后续的代码 - yield
线程调度器当前线程请求让出自己的 CPU 使用权
yield 和 sleep的区别:
sleep给其他线程运行机会时,不考虑线程的优先级别;yield只会给优先级高的线程机会。
sleep之后,线程为阻塞(blocked)状态,yield之后会转入就绪(ready)状态。
sleep有exception;sleep适配性更高。 - 死锁
互斥条件:进程要求对所分配的资源进行排他性控制,即在一段时间内某资源仅为一个进程所占有。此时若有其他进程请求该资源,则请求进程只能等待;
解决办法:无
不可剥夺条件:进程所获得的资源在未使用完毕之前,不能被其他进程强行夺走,即只能由获得该资源的进程自己来释放(只能是主动释放,如 yield 释放 CPU 执行权);
解决办法:一次性申请所有的资源
请求与保持条件:进程已经保持了至少一个资源,但又提出了新的资源请求,而该资源已被其他进程占有,此时请求进程被阻塞,但对自己已获得的资源保持不放;
解决办法:占用部分资源的线程进一步申请其他资源时,如果申请不到,可以主动释放它占有的资源。
循环等待条件:指在发生死锁时,必然存在一个线程请求资源的环形链,即线程集合 {T0,T1,T2,…Tn}中的 T0 正在等待一个 T1 占用的资源,T1 正在等待 T2 占用的资源,以此类推,Tn 正在等待己被 T0 占用的资源
解决办法:靠按序申请资源来预防。按某一顺序申请资源,释放资源则反序释放。 - 守护线程和用户线程
守护线程定义:所谓守护线程,是指在程序运行的时候在后台提供一种通用服务的线程。比如垃圾回收线程就是一个很称职的守护者,并且这种线程并不属于程序中不可或缺的部分。
当所有的非守护线程结束时,程序也就终止了,同时会杀死进程中的所有守护线程。反过来说,只要任何非守护线程还在运行,程序就不会终止。
用户线程定义:某种意义上的主要用户线程,只要有用户线程未执行完毕,JVM 虚拟机不会退出。 - threadLocal
- 线程池
https://blog.csdn.net/qq_40093255/article/details/116990431
一共四种线程池。具体看这个网址,解释的66666. - synchronized 和 lock 性能区别
synchronized 是托管给 JVM 执行的,而lock 是Java 写的控制锁的代码。 在Java1.5 中,synchronized 是性能低效的。 因为这是一个重量级操作,需要调用操作接口,导致有可能加锁消耗的系统时间比加锁以外的操作还多。类别 synchronized Lock 存在层次 Java的关键字,在jvm层面上 是一个类 锁的释放 1: 以获取锁的线程执行完同步代码,释放锁 在finally中必须释放锁,不然容易造成线程死锁 2: 线程执行发生异常,jvm会让线程释放锁 锁的获取 假设A线程获得锁,B线程等待。如果A线程阻塞,B线程会一直等待 分情况而定,Lock有多个锁获取的方式,具体下面会说道,大致就是可以尝试获得锁,线程可以不用一直等待 锁状态 无法判断 可以判断 锁类型 可重入 不可中断 非公平 可重入 可判断 可公平(两者皆可) 性能 少量同步 大量同步 - 列表项目
Java并发
Author: Sheng Wang
Permalink: https://shengwang.fun/2022/11/30/javathread/
License: Copyright (c) 2019 CC-BY-NC-4.0 LICENSE