多线程并发技术

1.并发编程三要素

原子性原子,即一个不可再被分割的颗粒。在Java中原子性指的是一个或多个操作要么全部执行成功要么全部执行失败。
有序性程序执行的顺序按照代码的先后顺序执行。(处理器可能会对指令进行重排序)
可见性当多个线程访问同一个变量时,如果其中一个线程对其作了修改,其他线程能立即获取到最新的值。

2. 线程的五大状态

  • 创建状态 当用 new 操作符创建一个线程的时候
  • 就绪状态 调用 start 方法,处于就绪状态的线程并不一定马上就会执行 run 方法,还需要等待CPU的调度
  • 运行状态 CPU 开始调度线程,并开始执行 run 方法
  • 阻塞状态 线程的执行过程中由于一些原因进入阻塞状态比如:调用 sleep 方法、尝试去得到一个锁等等
  • 死亡状态 run 方法执行完 或者 执行过程中遇到了一个异常

3.悲观锁与乐观锁

悲观锁:每次操作都会加锁,会造成线程阻塞。
乐观锁:每次操作不加锁而是假设没有冲突而去完成某项操作,如果因为冲突失败就重试,直到成功为止,不会造成线程阻塞。

4.线程之间的协作:wait/notify/notifyAll等

5.synchronized 关键字

6.CAS

CAS全称是Compare And Swap,即比较替换,是实现并发应用到的一种技术。操作包含三个操作数 —— 内存位置(V)、预期原值(A)和新值(B)。 如果内存位置的值与预期原值相匹配,那么处理器会自动将该位置值更新为新值 。否则,处理器不做任何操作。

7.线程池

如果我们使用线程的时候就去创建一个线程,虽然简单,但是存在很大的问题。如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统的效率,因为频繁创建线程和销毁线程需要时间。线程池通过复用可以大大减少线程频繁创建与销毁带来的性能上的损耗。