public class StaticInit { public static void main(String[] arg) { Thread th1 = new Thread(new Runnable() { public void run() { System.out.println(B.bStr); } }, "call-bStr"); Thread th2 = new Thread(new Runnable() { public void run() { System.out.println(C.cStr); } }, "call-cStr"); th1.start(); th2.start(); } } class B { static { try { System.out.println("Binit start"); Thread.sleep(1000); } catch (InterruptedException ex) { } System.out.println("b->cStr " + C.cStr); } static String bStr = "bStr"; } class C { static { try { System.out.println("Cinit start"); Thread.sleep(1000); } catch (InterruptedException ex) { } System.out.println("c->b.bStr " + B.bStr); } static String cStr = "cStr"; }
"call-cStr" prio=6 tid=0x0257cc00 nid=0x18a4 in Object.wait() [0x04c3f000] java.lang.Thread.State: RUNNABLE at C.<clinit>(StaticInit.java:40) at StaticInit$2.run(StaticInit.java:13) at java.lang.Thread.run(Thread.java:662) "call-bStr" prio=6 tid=0x0257a400 nid=0x1ddc in Object.wait() [0x04baf000] java.lang.Thread.State: RUNNABLE at B.<clinit>(StaticInit.java:28) at StaticInit$1.run(StaticInit.java:7) at java.lang.Thread.run(Thread.java:662)
相关推荐
《Java深度历险》是一本深入探讨Java技术的书籍,旨在帮助读者理解Java的内在机制,包括JVM(Java虚拟机)、JDK(Java开发工具包)和JRE(Java运行环境)之间的关系,以及类加载的过程等核心概念。通过这本书,你...
了解线程的生命周期、同步机制(synchronized、wait/notify、Lock接口等)以及死锁、活锁和饥饿现象,有助于编写高效、安全的并发代码。 8. **反射机制**: Java反射API允许在运行时检查类、接口、字段和方法的...
5. 初始化:执行类构造器(<clinit>)方法。 四、JVM调优 1. 参数调整:如-Xms和-Xmx设置堆大小,-XX:NewRatio调整新生代和老年代比例,-XX:SurvivorRatio设置Survivor空间比例。 2. 垃圾收集器选择:如CMS(并发...
- 并发与多线程:理解锁的原理,使用并发容器,避免死锁和活锁。 6. **JVM调优工具** - JConsole:监控JVM状态,包括内存、线程、类加载等。 - VisualVM:提供更详细的性能分析,如CPU、内存、线程和方法耗时。 ...
- 初始化:执行类的初始化方法 `<clinit>()`。 10. **双亲委派模型**: - Bootstrap ClassLoader:加载 Java 运行时核心类库。 - Extension ClassLoader:加载扩展类库。 - Application ClassLoader:加载用户...
- 初始化阶段:执行类构造器`<clinit>()`。 - **面试考察要点:** - 类加载器的种类及其工作原理。 - 双亲委派模型的意义。 **3.2 对象的创建过程** - **知识点概述:** - 分配内存。 - 初始化对象。 - 设置...
- 初始化:执行类构造器`<clinit>`方法,完成类的初始化。 #### 数据结构 **1. 数组和链表的区别?** - **数组:** - 在内存中连续存储元素。 - 支持随机访问,访问速度快。 - 插入和删除操作需要移动大量...
线程安全问题(如死锁、活锁、饥饿等)需要谨慎处理,合理使用并发工具类如Semaphore、CountDownLatch、CyclicBarrier等。 8. **线程池**: Java的ExecutorService和ThreadPoolExecutor提供了线程池管理,可以有效...
- **初始化**:执行类的构造器<clinit>()方法。 - **1.7 垃圾回收器**: - **概念**:自动管理内存,释放不再使用的对象所占用的空间。 - **机制**:标记-清除算法、复制算法、分代收集等。 - **触发条件**:堆...
- **初始化**:执行类的初始化方法<clinit>()。 4. **垃圾收集** - **GC Roots**:垃圾收集的起点,包括全局变量、静态变量、活动线程、JNI引用等。 - **可达性分析**:通过GC Roots追踪,确定哪些对象是可达的...
- **jstack**:打印线程堆栈信息,用于排查死锁等问题。 - **jconsole**:图形化监控JVM。 - **jhat**:分析堆转储文件。 - **MAT(Memory Analyzer Tool)**:Eclipse的内存分析工具。 10. **类加载过程**: ...
- **初始化**:执行类构造器<clinit>()方法,初始化静态变量和执行静态代码块。 #### 二十二、MyBatis底层实现原理 MyBatis是一个优秀的持久层框架,其核心组件和工作原理包括: - **SqlSessionFactory**:创建...
**JVM(Java Virtual Machine)概述** JVM,全称为Java虚拟机,是Java平台的核心组成部分,它负责...以上是JVM的一些核心概念和工作机制,理解这些知识点有助于优化Java应用程序的性能,解决内存溢出、死锁等问题。
- 初始化:执行类的初始化方法(<clinit>)。 4. **垃圾收集与内存管理** - 垃圾收集器(Garbage Collector, GC):自动回收不再使用的对象,避免内存泄漏。 - 分代收集:根据对象生命周期将堆分为新生代、老...
│ 高并发编程第一阶段23讲、多线程死锁分析,案例介绍.mp4 │ 高并发编程第一阶段24讲、线程间通信快速入门,使用wait和notify进行线程间的数据通信.mp4 │ 高并发编程第一阶段25讲、多Produce多Consume之间的...
Java 虚拟机(JVM)是 Java 平台的核心组成部分,它是负责运行 Java 字节码的...通过对这些 JVM 底层原理的深入理解,开发者可以更好地进行性能调优,解决内存溢出、死锁等问题,从而提升 Java 应用的稳定性和性能。
Java虚拟机(JVM)是Java程序运行的基础,它提供了执行字节码的平台无关环境。JVM规范定义了这个虚拟机如何工作,包括内存管理、类加载...同时,对于解决内存泄漏、线程死锁等问题,深入理解JVM规范也是至关重要的。
- **初始化**:执行类构造器`<clinit>()`方法。 #### 类加载机制 - **双亲委派模型**:由顶层的启动类加载器委托给父类加载器,再由父类加载器委托给子类加载器。 - **自定义类加载器**:可以通过继承`ClassLoader...
- **初始化(Initialized)**:执行类的初始化方法(<clinit>)。 5. **JVM调优**: - **JVM参数设置**:如-Xms、-Xmx设定堆内存大小,-XX:MaxHeapFreeRatio、-XX:MinHeapFreeRatio调整堆空闲比例。 - **GC调优**...
- **jstack**:查看线程堆栈信息,帮助诊断死锁等问题。 - **jconsole**:GUI工具,监控JVM性能和内存状态。 - **jhat**:分析堆转储文件,找出内存泄漏等问题。 - **MAT(Memory Analyzer Tool)**:Eclipse...