衡量服务性能的高低,重要指标之一是每秒事务处理数,即一秒内服务端平均能响应的请求总数(TPS)。
主内存与工作内存
Java内存模型的主要目标是定义程序中各个变量的访问规则,即在虚拟机中将变量存储到内存和从内存取出变量这样的底层细节。此处变量和Java编程中的变量有区别,它包括实例字段,静态字段和构成数组对象的元素,但不包括局部变量与方法参数,因为后者是线程私有的,不会被共享,所以不存在竞争问题。
Java内存模型规定了所有的变量都存储在主内存中。每条线程还有自己的工作内存,线程的工作内存中保存了被该线程使用到的变量的主内存副本拷贝,线程对变量的所有操作都必须在工作内存中进行,而不能直接读写主内存中的变量
工作内存同步回主内存之类的实现细节,Java内存模型定义了8种操作来完成:
lock锁定, unlock解锁,read读取,write写入。作用于主内存变量
load载入 ,use使用 ,assign赋值 ,store存储 ,。作用于工作内存的变量
voliatile型变量
当一个变量定义为volatile时,主要有两个特性,第一是保证此变量对所有线程的可见性,但不是原子性,所以仍然要通过加锁
synchronized或者concurrent的原子类来保证原子性。第二是禁止指令重排序优化。
volatile与普通变量的区别是,保证新值能立即同步到主内存,以及每次使用前立即从主内存刷新
线程的实现
主要有三种方式:使用内核线程实现、使用用户线程实现和使用用户线程加轻量级进程混合实现。
内核线程就是直接由操作系统内核支持的线程,这种线程由内核来完成切换,内核通过操纵调度器对线程进行调度,并负责将线程的任务映射到各个处理器上。
从广义上说,一个线程只要不是内核线程,就可以认为是用户线程
JAVA线程调度
线程调度是指系统为线程分配处理器使用权的过程,主要调度方式有两种,分别是协同线程调度和抢占式线程调度