1.进程和线程
进程: 一个程序, QQ.exe Music.exe程序的集合;
一个进程往往可以包含多个线程, 至少包含一个!
线程: 一个进程的多个子程序, 敲代码可以一边打字一边自动保存
2.Java真的可以开启线程吗?
不可以, start方法内部调用的是一个native本地方法—start0(), 属于底层的C++开启的线程, Java无法直接操作硬件
3.并发和并行
并发(多线程操作同一个资源):
CPU只有一个核心, 模拟出来多条线程, 抢资源, 看起来像多线程, 其实还是单线程
并行(多个人一起行走):
CPU 由多个核心, 多个线程可以同时执行
4.wait 方法和 sleep方法的区别
wait方法位于Object类, sleep方法位于Thread类
wait方法会释放锁(醒着的) ,sleep方法不会释放锁(抱着锁睡觉)
5.synchronized 和Lock 的区别
- synchronized是内置的Java关键字, Lock是一个Java类
- synchronized无法判断获取锁的状态, Lock可以判断是否获取到了锁
- synchronized会自动释放锁, lock必须要手动释放锁! 如果不释放锁, 会死锁
- synchronized下,假如线程1(获取到了锁,但是阻塞了)、线程2(会等待,一直傻傻的等); Lock锁就不一定会等下去
- synchronized可重入锁,不可以中断的,非公平的; Lock,可重入锁, 可以自定义公平与否
- synchronized 适合锁少量的代码同步问题, Lock适合锁大量的同步代码!
6.线程的六种状态?
public enum State {
//新生
NEW,
//运行
RUNNABLE,
//阻塞态
BLOCKED,
//等待
WAITING,
//超时等待
TIMED_WAITING,
//终止
TERMINATED;
}