JUC高并发-JUC概述

  1. 1. 一、进程与线程
    1. 1.1. 1.1 进程
    2. 1.2. 1.2 线程
  2. 2. 二、进程与线程的区别总结
  3. 3. 三、线程的状态
    1. 3.1. 3.1 线程状态的枚举类
      1. 3.1.1. 3.1.1 Thread.State
  4. 4. 四、并发与并行
  5. 5. 五、管程
  6. 6. 六、用户线程与守护线程

JUC 就是 java.util .concurrent 工具包的简称。这是一个处理线程的工具包,JDK 1.5开始出现的,在此包中增加了在并发编程中很常用的工具类。

一、进程与线程

1.1 进程

​ 一个在内存中运行的应用程序。每个进程都有自己独立的一块内存空间,一个进程可以有多个线程。

1.2 线程

​ 进程中的一个执行任务(控制单元),负责当前进程中程序的执行。一个进程至少有一个线程,一个进程可以运行多个线程,多个线程可共享数据。

​ 与进程不同的是同类的多个线程共享进程的堆和方法区资源,但每个线程有自己的程序计数器、虚拟机栈和本地方法栈,所以系统在产生一个线程,或是在各个线程之间作切换工作时,负担要比进程小得多,也正因为如此,线程也被称为轻量级进程。

二、进程与线程的区别总结

根本区别:进程是操作系统资源分配的基本单位,而线程是处理器任务调度和执行的基本单位

资源开销:每个进程都有独立的代码和数据空间(程序上下文),程序之间的切换会有较大的开销;线程可以看做轻量级的进程,同一类线程共享代码和数据空间,每个线程都有自己独立的运行栈和程序计数器(PC),线程之间切换的开销小。

包含关系:如果一个进程内有多个线程,则执行过程不是一条线的,而是多条线(线程)共同完成的;线程是进程的一部分,所以线程也被称为轻权进程或者轻量级进程。

内存分配:同一进程的线程共享本进程的地址空间和资源,而进程之间的地址空间和资源是相互独立的

影响关系:一个进程崩溃后,在保护模式下不会对其他进程产生影响,但是一个线程崩溃整个进程都死掉。所以多进程要比多线程健壮。

执行过程:每个独立的进程有程序运行的入口、顺序执行序列和程序出口。但是线程不能独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制,两者均可并发执行

三、线程的状态

3.1 线程状态的枚举类

3.1.1 Thread.State

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
public enum State {
/**
* 尚未启动的线程的线程状态.
*/
NEW, (新建)

/**
* 可运行线程的线程状态。
* 可运行的线程状态在Java虚拟机中执行,但可能正在等待来自操作系统的其他资源例如处理器。
*/
RUNNABLE, (准备就绪)

/**
* 线程的线程状态,该线程被阻止等待监视器锁定。
* 处于阻塞状态的线程正在等待监视器锁定
* 输入同步块/方法或
* 调用后重新输入同步块/方法
*{@link Object#wait() Object.wait}。
*/
BLOCKED, (阻塞)

/**
*等待线程的线程状态。
*由于调用以下方法:
*<ul>
*<li>{@linkObject#wait() Object.wait},无超时</li>
*<li>{@link#join()Thread.join},无超时</li>
*<li>{@link LockSupport#park()LockSupport.park}</li>
*</ul>
*
*<p>处于等待状态的线程正在等待另一个线程
*执行特定动作。
*
*例如,调用了<tt>Object.wait()</tt>的线程
*对象正在等待另一个线程调用
*<tt>Object.notify()</tt>或<tt>对象.notifyAll()</tt>打开
*该对象。已调用<tt>thread.jjoin()</tt>的线程
*正在等待指定的线程终止。
*/
WAITING, (不见不散)

/**
*具有指定等待时间的等待线程的线程状态。
*由于调用
*以下方法具有指定的正等待时间:
*<ul>
*<li>{@link#sleepThread.sleep}</li>
*<li>{@link Object#wait(long)Object.wait}超时</li>
*<li>{@link#join(long)Thread.join}超时</li>
* <li>{@link LockSupport#parkNanos LockSupport.parkNanos}</li>
* <li>{@link LockSupport#parkUntil LockSupport.parkUntil}</li>
* </ul>
*/
TIMED_WAITING, (过时不候)

/**
* 终止线程的线程状态。
* 线程已完成执行。
*/
TERMINATED; (终结)
}

四、并发与并行

并发:同一时刻多个线程在访问统一资源,多个线程对一个点

​ 例子: 春运抢票、电商秒杀…

并行:多项工作一起执行,之后再汇总

       例如:泡方便面,电水壶烧水,一边撕调料倒入桶中...

五、管程

     管程叫做Monitor监视器,java中叫做锁,在操作系统中叫做监视器,它是一个同步机制,保证在同一时间内,只有一个线程能去访问被保护的数据或代码。

六、用户线程与守护线程

用户线程:我们用的级别上都是用户线程,自定义线程。

守护线程:比如垃圾回收