多线程
qq_21010647
这个作者很懒,什么都没留下…
展开
-
使用 ThreadPoolExecutor 的构造函数声明线程池
线程池必须手动通过 ThreadPoolExecutor 的构造函数来声明,避免使用Executors 类的 newFixedThreadPool 和 newCachedThreadPool ,因为可能会有 OOM 的风险。Executors 返回线程池对象的弊端如下:FixedThreadPool 和 SingleThreadExecutor : 允许请求的队列长度为 Integer.MAX_VALUE,可能堆积大量的请求,从而导致 OOM。CachedThreadPool 和 ScheduledT原创 2020-07-10 15:29:17 · 191 阅读 · 0 评论 -
JDK 提供的并发容器总结
JDK 提供的这些容器大部分在 java.util.concurrent 包中。ConcurrentHashMap: 线程安全的 HashMapCopyOnWriteArrayList: 线程安全的 List,在读多写少的场合性能非常好,远远好于 Vector.ConcurrentLinkedQueue: 高效的并发队列,使用链表实现。可以看做一个线程安全的LinkedList,这是一个非阻塞队列。BlockingQueue: 这是一个接口,JDK 内部通过链表、数组等方式实现了这个接口。表示阻原创 2020-07-09 11:07:30 · 614 阅读 · 0 评论 -
什么是线程死锁?如何避免死锁?
线程死锁描述的是这样一种情况:多个线程同时被阻塞,它们中的一个或者全部都在等待某个资源被释放。由于线程被无限期地阻塞,因此程序不可能正常终止。如下图所示,线程 A 持有资源 2,线程 B 持有资源 1,他们同时都想申请对方的资源,所以这两个线程就会互相等待而进入死锁状态。1.产生死锁的四个必要条件?学过操作系统的朋友都知道产生死锁必须具备以下四个条件:互斥条件:该资源任意一个时刻只由一个线程占用。请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。不剥夺条件:线程已获得的资源在原创 2020-07-08 20:06:58 · 129 阅读 · 0 评论 -
什么是上下文切换?
多线程编程中一般线程的个数都大于 CPU 核心的个数,而一个 CPU 核心在任意时刻只能被一个线程使用,为了让这些线 能程都 得到有效执行,CPU 采取的策略是为每个线程分配时间片并轮转的形式。当一个线程的时间片用完的时候就会重新处于就绪状态让给其他线程使用,这个过程就属于一次上下文切换。概括来说就是:当前任务在执行完 CPU 时间片切换到另一个任务之前会先保存自己的状态,以便下次再切换回这个任务时,可以再加载这个任务的状态。任务从保存到再加载的过程就是一次上下文切换。上下文切换通常是计算密集型的。也就原创 2020-07-08 19:28:17 · 893 阅读 · 0 评论 -
JVM内存模型、Java内存模型
1、JVM内存模型(区别Java内存模型) JVM内存主要分为:程序计数器,Java虚拟机栈,本地方法栈,Java堆,方法区。 1、程序计数器: 为了线程切换能恢复到正确的执行位置,每条线程都需要一个独立的程序计数器,各条线程之间计数器互不影响,独立存储,我们称这类内存区域为“线程私有”的内存。计数器记录的是正在执行的虚拟机字节码指令的地址。 2、Java虚拟机栈: 每个方法在执行的同时都会创建一个栈帧,用于存储局部变量表、操作数栈、动态链接(例如多态就要动态链接以确定引用的状态)、方法出口等转载 2020-07-08 14:17:13 · 147 阅读 · 0 评论 -
什么是线程和进程?
1. 何为进程?进程是程序的一次执行过程,是系统运行程序的基本单位,因此进程是动态的。系统运行一个程序即是一个进程从创建,运行到消亡的过程。在 Java 中,当我们启动 main 函数时其实就是启动了一个 JVM 的进程,而 main 函数所在的线程就是这个进程中的一个线程,也称主线程。如下图所示,在 windows 中通过查看任务管理器的方式,我们就可以清楚看到 window 当前运行的进程(.exe 文件的运行)。2. 何为线程?线程与进程相似,但线程是一个比进程更小的执行单位。一个进程在其原创 2020-07-08 13:47:17 · 566 阅读 · 0 评论