前言
在高并发、大数据的互联网场景下,并发编程一直是程序员必须要掌握的重中之重,是最能体现一个程序员功底的方面之一。多线程可以在包含多个CPU核心的机器上同时处理多个不同的 任务,优化资源的使用率,提升程序的效率。在一些对性能要求比较高场合,多线程是java程序调优的重要方面。
并发编程三要素
原子性:即一个不可再被分割的颗粒。在Java中原子性指的是一个或多个操作要么全部执行成功要么全部执行失败。比如多线程去操作共享变量,操作不是原子性,为了线程安全,最简单的就是加锁;
有序性:程序执行的顺序按照代码的先后顺序执行。(处理器可能会对指令进行重排序);程序需要做一些优化,怎么样让cpu或者操作系统调度或者代码编译,让代码执行有序性?
可见性:当多个线程访问同一个变量时,如果其中一个线程对其作了修改,其他线程能立即获取到最新的值。 尤其实现多个线程共享时的数据。
线程的五大状态
创建状态:当用 new 操作符创建一个线程的时候 ;
就绪状态:调用 start 方法,处于就绪状态的线程并不一定马上就会执行 run 方法,还需要等 待CPU的调度
运行状态:CPU 开始调度线程,并开始执行 run 方法
阻塞状态:线程的执行过程中由于一些原因进入阻塞状态比如:调用 sleep 方法、尝试去得到 一个锁等等
死亡状态:run 方法执行完 或者 执行过程中遇到了一个异常
后续章节会为大家详细介绍。
线程间的协作
线程间的协作有:wait/notify/notifyAll等
锁
锁是为了控制多个线程操作共享资源时,为了保证线程安全的一种机制,java里面提供了不同的锁:同步锁 synchronized ,Lock接口,队列同步器AQS,重入锁(ReentrantLock),读写锁等等。
CAS
CAS全称是Compare And Swap,即比较替换,是实现并发应用到的一种技术。操作包含三个 操作数—内存位置(V)、预期原值(A)和新值(B)。如果内存位置的值与预期原值相匹配, 那么处理器会自动将该位置值更新为新值 。否则,处理器不做任何操作。
CAS存在三大问题:ABA问题,循环时间长开销大,以及只能保证一个共享变量的原子操作。
线程池
池化技术,我们工作中接触的比较多,比如数据库连接池,线程池,都是通过复用可以大大减少线程频繁创建与销毁带来的性能损耗。
后续
很多人说并发编程复杂、难学,是因为其涉及的部分比较多,大家可以跟着一起学习,一起探讨,分节点分模块一个一个击破,做到 分而治之、化繁为简。