摘要:
线程池介绍 线程池(thread pool):一种线程使用模式。线程过多会带来调度开销,进而影响缓存局部性和整体性能。而线程池维护着多个线程,对线程统一管理。 线程池就是存放线程的池子,池子里存放了很多可以复用的线程。 创建线程和销毁线程的花销是比较大的(手动new Thread 类),创建和消耗线 阅读全文
摘要:
1、什么是原子操作类 原子性:无论有多少个操作,只要我们将这部分操作通过加锁的形式进行锁定,那么就可以视为一个原子性操作。原子性操作 = 线程安全。 原子操作类:提供了可以保证我们线程安全的类。可以直接使用。 当程序更新一个变量时,如果多线程同时更新这个变量,可能得到期望之外的值,比如变量i=1,A 阅读全文
摘要:
0、什么是Lock锁 java.util.concurrent.locks.Lock 是一个类似于synchronized 块的线程同步机制。但是 Lock比 synchronized 块更加灵活。Lock是个接口,有个实现类是ReentrantLock。 1、自定义Lock锁 当我们在学习Lock 阅读全文
摘要:
1、Volatile 定义 在多线程并发编程中synchronized和volatile都扮演着重要的角色,volatile是轻量级的synchronized,它在多处理器开发中保证了共享变量的“可见性”。可见性的意思是当一个线程修改一个共享变量时,另外一个线程能读到这个修改的值。如果volatil 阅读全文
摘要:
0、为什么要有内存模型? 想要回答这个问题,需要先弄懂传统计算机硬件内存架构。 0.1 硬件内存架构 (1)CPU:一般服务器上有多个CPU,每个CPU有多个核,这就意味着多个cpu或者多个核可以并发工作 (2)CPU Register:CPU寄存器,是CPU内部集成的,在寄存器上执行操作的效率要比 阅读全文
摘要:
为什么需要使用锁?因为CPU在共享时,在临界区会由于操作指令交错而出现实际结果与目标结果不符的问题。 一个程序运行多个线程本身是没有问题的。问题出现在多个线程访问共享资源时,读写操作发生指令交错。 一段代码块中,如果存在对共享资源的多线程读写操作,这称这段代码为临界区,也叫同步代码块。 例如: st 阅读全文
摘要:
1、Java——天生的多线程 在一个进程里可以创建多个线程,这些线程都拥有各自的计数器、堆栈和局部变量等属性,并且能够访问共享的内存变量。处理器在这些线程上高速切换,让使用者感觉到这些线程在同时执行。 当前的main函数就是一个 JVM 进程。 打印出来的 6 条线程信息就是进程中的多条线程。 示例 阅读全文
摘要:
一、进程 1、概述 进程:程序是静止的,程序实体的运行过程就是进程,是系统进行资源分配的基本单位 进程的特征:并发性、异步性、动态性、独立性、结构性 线程:线程是属于进程的,是一个基本的 CPU 执行单元,是程序执行流的最小单元。线程是进程中的一个实体,是系统独立调度的基本单位,线程本身不拥有系统资 阅读全文
摘要:
1、栈帧的结构 Java虚拟机以方法作为最基本的执行单元,“栈帧”(Stack Frame)则是用于支持虚拟机进行方法调用和方法执行背后的数据结构,它也是虚拟机运行时数据区中的虚拟机栈(Virtual Machine Stack)的栈元素。栈帧存储了方法的局部变量表、操作数栈、动态连接和方法返回地址 阅读全文
摘要:
1、判断对象是否存活 1.1 引用计数算法(虚拟机中基本不用) 很多教科书判断对象是否存活的算法是这样的:在对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加一;当引用失效时,计数器值就减一;任何时刻计数器为零的对象就是不可能再被使用的。 客观地说,引用计数算法(Reference Co 阅读全文
摘要:
1、运行时数据区概述 Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。这些区域有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而一直存在,有些区域则是依赖用户线程的启动和结束而建立和销毁。根据《Java虚拟机规范》的规定,Java虚拟机所管理的内 阅读全文