Thread Dump分析
使用 jps 或 ps –ef | grep java (获取PID) jstack [-l ] <pid> | tee -a jstack.log(获取ThreadDump) 分析 头部信息:时间,JVM信息 2024-07-19 12:45:51 Full thread dump Java HotSpot(TM) 64-Bit Server VM (25.3...
使用 jps 或 ps –ef | grep java (获取PID) jstack [-l ] <pid> | tee -a jstack.log(获取ThreadDump) 分析 头部信息:时间,JVM信息 2024-07-19 12:45:51 Full thread dump Java HotSpot(TM) 64-Bit Server VM (25.3...
volatile 可以保证可见性,但不保证原子性: 当写一个 volatile 变量时,JMM 会把该线程在本地内存中的变量强制刷新到主内存中去; 这个写操作会导致其他线程中的 volatile 变量缓存无效。 volatile 会禁止指令重排 重排序需要遵守的规则: 重排序不会对存在数据依赖关系的操作进行重排序。比如:a=1;b=a; 这个指令序列,因为第二个操作...
在 Java 中,我们可以使用 synchronized 关键字和 CAS 来实现加锁效果。 悲观锁: 对于悲观锁来说,它总是认为每次访问共享资源时会发生冲突,所以必须对每次数据操作加上锁,以保证临界区的程序同一时间只能有一个线程在执行。 synchronized 是悲观锁,尽管随着 JDK 版本的升级,synchronized 关键字已经“轻量级”了很多,但...
public class Test { static int i; public void test() { synchronized (this) { i++; } } } 0 aload_0 1 dup 2 astore_1 // monitorenter 指令在编译后会插入到同步代码块的开始位置...
Java 多线程的锁都是基于对象的,Java 中的每一个对象都可以作为一个锁。 类锁,其实就是 Class 对象的锁。 Class 对象是一种特殊的 Java 对象,代表了程序中的类和接口。Java 中的每个类型(包括类、接口、数组以及基础类型)在 JVM 中都有一个唯一的 Class 对象与之对应。这个 Class 对象被创建的时机是在 JVM 加载类时,由 JVM ...
线程组 每个 Thread 必然存在于一个 ThreadGroup 中,Thread 不能独立于 ThreadGroup 存在。执行main()方法的线程名字是 main,如果在 new Thread 时没有显式指定,那么默认将父线程的线程组设置为自己的线程组。 public static void main(String[] args) { Thread thread = ...
Java 内存模型 Java 内存模型(Java Memory Model,JMM)定义了 Java 程序中的变量、线程如何和主存以及工作内存进行交互的规则。它主要涉及到多线程环境下的共享变量可见性、指令重排等问题,是理解并发编程中的关键概念。 两种并发模型: 如何通信 如何同步 ...
OS 中的进程/线程状态 操作系统中的进程/线程状态转换图: Java 线程的六个状态: // Thread.State 源码 public enum State { NEW, RUNNABLE, BLOCKED, WAITING, TIMED_WAITING, TERMINATED; } NEW 处于 NEW 状态的线...
无返回值的 Runnable public interface Runnable { public abstract void run(); } public static void main(String[] args) throws ExecutionException, InterruptedException { // 创建一个包含5个线程的线程池 Ex...
创建线程的三种方式 继承Thread类 class MyThread extends Thread { @Override public void run() { for (int i = 0; i < 100; i++) { System.out.println(getName() + " " + i); ...