JUC笔记(初识)
一、What
JUC介绍
在 Java 5.0 提供了 java.util.concurrent (简称JUC )包,在此包中增加了在并发编程中很常用的实用工具类,用于定义类似于线程的自定义子系统,包括线程池、异步 IO 和轻量级任务框架。提供可调的、灵活的线程池。还提供了设计用于多线程上下文中的 Collection 实现等。
JMM介绍
Java虚拟机规范中定义了Java内存模型(Java Memory Model,JMM),用于屏蔽掉各种硬件和操作系统的内存访问差异,以实现让Java程序在各种平台下都能达到一致的并发效果,JMM规范了Java虚拟机与计算机内存是如何协同工作的:规定了一个线程如何和何时可以看到由其他线程修改过后的共享变量的值,以及在必须时如何同步的访问共享变量
Java内存模型定义了以下八种操作来完成:
- lock(锁定):作用于主内存的变量,把一个变量标识为一条线程独占状态。
- unlock(解锁):作用于主内存变量,把一个处于锁定状态的变量释放出来,释放后的变量才可以被其他线程锁定。
- read(读取):作用于主内存变量,把一个变量值从主内存传输到线程的工作内存中,以便随后的load动作使用
- load(载入):作用于工作内存的变量,它把read操作从主内存中得到的变量值放入工作内存的变量副本中。
- use(使用):作用于工作内存的变量,把工作内存中的一个变量值传递给执行引擎,每当虚拟机遇到一个需要使用变量的值的字节码指令时将会执行这个操作。
- assign(赋值):作用于工作内存的变量,它把一个从执行引擎接收到的值赋值给工作内存的变量,每当虚拟机遇到一个给变量赋值的字节码指令时执行这个操作。
- store(存储):作用于工作内存的变量,把工作内存中的一个变量的值传送到主内存中,以便随后的write的操作。
- write(写入):作用于主内存的变量,它把store操作从工作内存中一个变量的值传送到主内存的变量中。
Thread介绍
- 线程是程序中执行的线程。 Java虚拟机允许应用程序同时执行多个执行线程。
- 线程状态。线程可以处于以下状态之一:
NEW
:就绪
尚未启动的线程处于此状态。RUNNABLE
:运行
在Java虚拟机中执行的线程处于此状态。BLOCKED
:阻塞- 被阻塞等待监视器锁定的线程处于此状态。
WAITING
:等待,死等
正在等待另一个线程执行特定动作的线程处于此状态。TIMED_WAITING
:等待,超时等待
正在等待另一个线程执行动作达到指定等待时间的线程处于此状态。TERMINATED
:终止
已退出的线程处于此状态。
- wait/slepp
- wait会释放锁、sleep不会释放锁
- wait必须在同步代码块
- wait属于Object与notify和notifyAll使用、sleep属于Thread