进程: 进程就是一个程序运行的实例,称作进程。进程是动态的,而程序是静态的。只有运行起来的程序才叫做进程。
进程和线程: 进程是操作系统分配资源的最小单位,线程是操作系统调度的最小单位,一个程序至少有一个进程,一个进程至少有一个线程。
为什么使用线程池:首先线程池可以管理线程的生命周期,线程池会管理线程的创建,控制运行线程的数量,实现线程的复用,可以提高程序的响应效率,避免频繁的创建销毁线程,节省cpu的效率。
上下文: 某一时间点的cpu寄存器和pc计数器。
pc计数器: 也叫做程序计数器,里面储存着,要执行的下一条指令的地址。
重量级锁: 像synchronized就是一个重量级的锁,重量级的锁依赖的是内部监视器来实现的,而内部监视器本质上依赖的操作系统的重量级锁来实现的,而操作系统的线程之间的切换,成本是比较大的,这也是为什么早期的synchronized效率比较低下的原因,不过synchronized在jdk后续的版本做了优化,效率已经不错了。像这种依赖一操作系统重量级锁的锁叫做重量级锁。(现在的synchronized采用了锁升级,先是无锁状态,偏向锁,轻量级锁,重量级锁)
偏向锁: 只有一个线程的情况下是用的偏向级锁,若多线程交替执行,则会进行锁的升级,锁升级是不能降级的,升级为轻量级锁。
轻量级锁: 轻量级锁用于多线程交替执行不存在线程抢占锁的情况下,如果出现了线程抢占锁的情况,将会升级为重量级锁。
死锁的四大必要条件: 互斥条件,占有且申请,循环等待,不可剥夺
lock: lock的接口的锁是更加具有扩展性的,他是更加的灵活的,这个锁支持公平的加锁,可以响应中断指令,显示的加锁和显示的释放,但是但多数的情况下还是使用synchronized,因为非公平锁的效率是更加的高的。
synchronized和Rentrantlock: