1、并发编程三要素
原子性:即一个不可再被分割的颗粒。在Java中原子性指的是一个或多个操作要么全部执行成功要么全部执行失败。
有序性:程序执行的顺序按照代码的先后顺序执行。(处理器可能会对指令进行重排序)
可见性:当多个线程访问同一个变量时,如果其中一个线程对其作了修改,其他线程能立即获取到最新的值。
2、线程的五大状态
创建状态:当用new操作符创建一个线程的时候。
就绪状态:当调用start方法的时候。处于就绪状态的线程并不一定马上就会执行run方法,还需要等待CPU的调度。
运行状态:CPU开始调度线程,并开始执行run方法时。
阻塞状态:线程的执行过程中由于一些原因进入阻塞状态,比如调用sleep方法、尝试去得到一个锁等等。
死亡状态:run方法执行完或者执行过程中遇到了一个异常。
3、悲观锁与乐观锁
悲观锁:每次操作都会加锁,会造成线程阻塞。
乐观锁:每次操作不加锁而是假设没有冲突而去完成某项操作,如果因为冲突失败就重试,直到成功为止,不会造成线程阻塞。
4、线程之间的协作
线程之间的协作有:wait/notify/notifyAll等
5、synchronized关键字
synchronized是Java中的关键字,是一种同步锁。它修饰的对象有以下几种:
修饰一个代码块:被修饰的代码块成为同步语句块,其作用的范围是大括号{}括起来的代码,作用的对象是调用这个代码块的对象。
修饰一个方法:被修饰的方法称为同步方法,其作用范围是整个方法,作用的对象是调用这个方法的对象。
修饰一个静态方法:其作用范围是整个静态方法,作用的对象是这个类的所有对象
修饰一个静态代码块:其作用的范围是synchronized后面括号括起来的部分,作用的对象是这个类的所有对象。
6、CAS
CAS全称是Compare And Swap,即比较替换,是实现并发应用到的一种技术。操作包含三个操作数-内存位置(V)、预期原值(A)和新值(B)。
如果内存位置的值与预期原值相匹配,那么处理器会自动将该位置值更新为新值。否则,处理器不做任何操作。
CAS存在三大问题:ABA问题,循环时间长开销大,以及只能保证一个共享变量的原子操作。
7、线程池
如果我们使用线程的时候就去创建一个线程,虽然简单,但是存在很大的问题。如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,
这样频繁的创建线程就会大大降低系统的效率,因为频繁创建线程和销毁线程需要时间。线程池通过复用可以大大减少线程频繁创建与销毁带来的性能上的损耗。