JUC是什么
JUC是JAVA中java.util.concurrent包的简称.
这个包里面的东西就是Doug Lea写的,它主要包括atomic支持原子操作类相关代码,locksjava中锁相关代码,还有其他并发容器相关代码.
在jdk官方手册中可以看到juc相关的jar包有三个。用中文概括一下,JUC的意思就是java并发编程工具包。
上下文切换的概念
CPU通过时间片分配算法来循环执行任务,当前执行一个时间片后会切换到下一个任务。
但是,在切换前会保存上一个任务的状态,以便下次切换会这个任务时,可以再加载这个任务的状态。所以任务保存倒在加载就是一次上下文切换。
如何减少上下文切换
使用并发编程、CAS算法、使用最少线程和使用协程。
无锁并发编程
多线程竞争锁时,会引起上下文切换,所以多线程处理数据,可以用一些办法来避免使用锁,如将数据的ID按照Hash算法取模分段,不同的线程处理不同段的数据。
CAS算法(乐观锁)
Java的Atomic包使用CAS算法来更新数据,而不需要加锁。
使用最少线程
避免创建不需要的线程,比如任务少,但是创建了很多线程来处理,这样就会造成大量线程都处于等待状态。
协程
在单线程里实现多任务的调度,并在单线程里维持多个任务间的切换。
进程/线程的概念
进程:
进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动。它是操作系统动态执行的基本单元,在传统的操作系统中,进程既是基本的分配单元,也是基本的执行单元。
线程:
通常在一个进程中可以包含若干个线程,当然一个进程中至少有一个线程,不然没有存在的意义。线程可以利用进程所拥有的资源,在引入线程的操作系统中,通常都是把进程作为分配资源的基本单位,而把线程作为独立运行和独立调度的基本单位,由于线程比进程更小,基本上不拥有系统资源,故对它的调度所付出的开销就会小得多,能更高效的提高系统多个程序间并发执行的程度。
线程状态
线程的状态:
a.线程的状态
jps看线程的线程号
jstack看线程某个时刻的运行情况(线程的快照)
jvisualvm-对线程进行dump
b.线程调用sleep
进入Tim