JUC-11-AQS
AQS 理论介绍
源码
AQS
AQS(AbstractQueuedSynchronizer)是Java中的一个抽象基类,用于实现同步器(Synchronizer)。它是Java并发包中一些重要的同步工具的基础,如ReentrantLock、Semaphore、CountDownLatch等。AQS提供了一种底层机制,帮助开发者实现自定义的同步器,从而能够更灵活地管理多线程之间的竞争和协作。
同步器的概念:
同步器是一种用于控制多线程访问共享资源的机制,它通常包含两个重要的方法:acquire(获取锁)和release(释放锁)。这两个方法分别用于在多线程之间协调资源的访问,确保线程安全。
AQS的基本结构:
AQS的核心思想是维护一个等待队列(Wait Queue)和一个状态变量(State)。等待队列中的线程按照先进先出(FIFO)的顺序等待获取锁或资源。状态变量表示同步器的状态,不同的同步器可以定义不同的状态语义。
AQS的主要方法:
方法
说明
acquire(int arg)
用于获取锁或资源,如果无法获取,则将当前线程加入等待队列,然后自旋等待或阻塞 ...
JUC-10-Synchronized与锁升级
Synchronized性能变化
Java5前,只有synchronized重量级锁,如果竞争激烈,性能会下降
Java早期版本中,synchronized属于重量级锁,效率低下,因为监视器锁(monitor)是依赖底层的操作系统的MutexLock(系统互斥量)实现的,挂起线程和恢复线程都需要转入内核态去完成,阻塞或唤醒一个Java线程需要操作系统切换CPU状态来完成,这种状态切换需要耗费处理器时间。
Java的线程是映射到操作系统原生线程之上的,如果要阻塞或唤醒一个线程就需要操作系统介入,需要在户态与核心态之间切换,这种切换会消耗大量的系统资源。为了减少获得锁和释放锁所带来的性能消耗引入了轻量级锁和偏向锁。
WHY 每个对象都可以成为一个锁
Monitor是一个同步工具,常被描述为一个Java对象,它依赖于底层操作系统的MutexLock实现,操作系统实现线程之间的切换需要从用户态到内核态的转换是成本非常高的
Monitor
JVM中的同步基于进入和退出管程(Monitor)对象实现,每个对象实例都会有一个Monitor,Monitor可以和对象一起创建、销毁。Mon ...
JUC-9-Java对象内存布局和对象头
谈谈你对改代码的理解?
1Object obj = new Object();
对象在堆中内存布局
对象内部结构分为:对象头、实例数据、对齐填充(保证8个字节的倍数)。对象头分为对象标记(markOop)和类元信息(klassOop),类元信息存储的是指向该对象类元数据(Klass)的首地址。
对象头
对象标记 Mark Word
默认存储对象的HashCode、分代年龄和锁标志位等信息。这些信息都是与对象自身定义无关的数据。MarkWord被设计成一个非固定的数据结构以便在极小的空间内存存储尽量多的数据,它会根据对象的状态复用自己的存储空间,在运行期间MarkWord里存储的数据会随着锁标志位的变化而变化。
类元信息(类型指针)
对象指向它的类元数据的指针,虚拟机通过该指针确定这个对象是哪个类的实例
实例数据存放类的属性(Field)数据信息,包括父类的属性信息
对齐填充虚拟机要求对象起始地址必须是8字节的整数倍。填充数据不是必须存在的,仅是为字节对齐这部分内存按8字节补充对齐。
JUC-8-ThreadLocal
ThreadLocal 介绍
WHAT
ThreadLocal提供线程局部变量,这些变量与正常变量不同,每一个线程在访问ThreadLocal实例时都有自己的、独立初始化的变量副本。ThreadLocal实例通常是类中的私有静态字段,使用它的目的是希望将状态(例如,用户ID或事务ID)与线程关联起来。
WHY
每一个线程都有自己专属的本地变量副本,主要解决让每个线程绑定自己的值,通过使用get()和set()方法获取默认值或将其值更改为当前线程所存的副本的值从而避免了线程安全问题
Methods
栗子
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051class House { int saleCount = 0; public synchronized void saleHouse() { ++saleCount; } ThreadLocal<Integer&g ...
JVM 性能监控与调优篇-3-GUI监控诊断工具
工具概述
命令行工具及其组合局限
无法获取方法级别的分析数据,如方法间的调用关系、各方法的调用次数和调用时间等
要求用户登录到目标Java应用所在的宿主机上,使用起来不是很方便
分析数据通过终端输出,结果展示不够直观
GUI
jconsole
概述
从Java5开始JDK中自带java监控和管理控制台,用于对JVM中内存、线程和类等的监控,是一个基于JMX(java management extensions)的GUI性能监控工具。
启动
在jdk/bin目录下启动jconsole.exe即可,无需使用jps命令查询
连接方式
连接方式
说明
Local
使用JConsole连接一个正在本地系统运行的JVM,并且执行程序的和运行JConsole的需要是同一个用户。JConsole使用文件系统的授权通过RMI连接器连接到平台的MBean服务器上。这种从本地连接的监控能力只有Sun的JDK具有。
Remote
使用下面的URL通过RMI连接器连接到一个MX代理service:jmx:rmi://hostName:portNum/imxrmi。J ...
JVM 性能监控与调优篇-2-命令行监控诊断工具
查看正在运行的Java进程显示指定系统内所有的HotSpot虚拟机进程(查看虚拟机进程信息),可用于查询正在运行的虚拟机进程。
对于本地虚拟机进程来说,进程的本地虚拟机ID与操作系统的进程ID是一致的,它是唯一的。
命令
12# 查看正在运行的Java进程jps [option] [hostid]
option
option参数
说明
-q
仅仅显示LVMID(local virtual machine id),即本地虚拟机唯一id。不显示主类的名称等
-l
输出应用程序主类的全类名或如果进程执行的是jar包,则输出jar完整路径
-m
输出虚拟机进程启动时传递给主类main()的参数
-v
列出虚拟机进程启动时的JVM参数
如果某Java进程关闭默认开启的UsePerfData参数(即使用参数-XX :-UsePerfData),那么jps命令(以及jstat)将无法探知该Java进程。
hostid
RMI注册表中注册的主机名
如果想要远程监控主机上的java程序,需要安装jstatd
对于具有更严格的安全实践的网络场所而言,可能使 ...