线程相关概念

线程的五大状态

创建状态:当用new操作符创建一个线程的时候。

就绪状态:调用start方法,处于就绪状态的线程并不一定马上就执行run方法,还需要等待CPU的调度。

运行状态:CPU开始调度线程,并开始执行Run方法。

阻塞状态:线程的执行过程中可能因为一些原因进入阻塞状态,比如调用sleep方法,获取尝试得到一个锁等等。、

死亡状态:Run方法执行完或者执行中遇到异常。

悲观锁和乐观锁

悲观锁:认为一定会有其他线程来改变他,所以每次操作就会加锁,会造成线程阻塞。

乐观锁:认为不会有线程来改变他,每次操作不会加锁,但是如果因为其他线程来改变了值,造成了冲突,会因为冲突而操作失败,但是他又会继续重试,直到成功为止,不会造成线程阻塞。

4) 线程之间的协作

线程之间的协作有:wait、notify、notifyAll等

5) Synchronized关键字(同步锁)

修饰一个代码块:被修饰的代码块称为同步语句块,作用范围是大括号{}括起来的代码,作用的对象是调用这个代码块的对象。

修饰一个方法:被修饰的方法称为同步方法,作用范围是整个方法,作用的对象是调用这个方法的对象。

修饰一个静态的方法:作用范围是整个静态方法,所用的对象是这个类中的所有对象。

修饰一个类:作用范围是synchronized后面括起来的部分,作用的对象是这个类中的所有对象

6) CAS

比较替换,是实现并发应用的一种技术,主要用于不想使线程进入阻塞的一种方式,操作包含三个操作数-内存位置V、预期原值A、新值B,如果内存位置和预期原值相匹配,处理器自动将该位置的值改为新值,否则就不做处理。

CAS三大问题:ABA问题、循环时间长开销大、只能保证一个共享变量的原子操作,即一个CAS只能处理一个。

线程池

如果使用一个线程就创建一个,存在如果并发的线程量大,且每个线程执行一个任务就结束了,这样频繁的创建线程就会给系统带来很大的开销,导致系统效率大大降低,因为频繁创建线程和销毁线程是需要时间的,而线程池可以对线程进行复用,大大减少线程创建和销毁所带来的性能消耗。