JAVA多线程类初始化

首先说明:Java语言规范规定,对于每一个类或者接口,都有一个唯一的初始化锁与之对应。

Java多线程类初始化过程为4个阶段

一、获取Class对象的初始化锁

    获取Class对象的初始化锁来控制类或者接口的初始化过程,这个锁是线程阻塞的(即A获取了锁,B线程就会等待)

二、获得了锁的线程A进行初始化

    执行类的静态初始化:

                                1.分配内存空间

                                3.地址赋值给引用变量

                                2.初始化对象

                注意:这里虽然2.3重排序,但是其他线程不可见,这是处理器对其做的优化

三、线程A初始化完成,然后唤醒其他等待的线程

        这里A的初始化处理过程完成

四、其他线程B结束

    其他线程B获得锁后,读到类已经初始化过了,则结束

### Java 中内嵌的相关知识 #### 什么是内嵌? 在 Java 中,内嵌(Nested Class)是指定义在一个外部内部的。它允许将辅助隐藏在外层中,从而提高封装性和模块化程度。 --- #### 内嵌的分 Java 的内嵌主要分为以下几种: 1. **静态嵌套 (Static Nested Class)** 静态嵌套是被声明为 `static` 的内嵌,它可以像普通的顶级一样独立于外层实例存在。它的特点是可以直接通过外部名来访问。 示例代码如下: ```java public class OuterClass { static class StaticNestedClass { void display() { System.out.println("这是静态嵌套的方法"); } } public static void main(String[] args) { // 创建并调用静态嵌套的对象 OuterClass.StaticNestedClass nestedObject = new OuterClass.StaticNestedClass(); nestedObject.display(); } } ``` 2. **成员内嵌 (Non-static Inner Class)** 成员内嵌是非静态的内嵌,它依赖于外部的一个具体实例才能创建对象。因此,必须先有外部的实例,才能创建其对应的内嵌实例。 示例代码如下: ```java public class OuterClass { private String outerField = "外部字段"; class InnerClass { void display() { System.out.println("外部字段:" + outerField); } } public static void main(String[] args) { OuterClass outerInstance = new OuterClass(); OuterClass.InnerClass innerInstance = outerInstance.new InnerClass(); innerInstance.display(); } } ``` 3. **局部 (Local Class)** 局部是在方法或作用域内的临时,通常用于简化某些特定功能的实现。它们只能在其所在的作用域内使用,并且可以访问该作用域中的最终变量[^1]。 示例代码如下: ```java public class LocalClassExample { public void createLocalClass(int value) { final int localValue = value; class LocalClass { void printMessage() { System.out.println("局部打印消息:" + localValue); } } LocalClass lc = new LocalClass(); lc.printMessage(); } public static void main(String[] args) { LocalClassExample example = new LocalClassExample(); example.createLocalClass(42); } } ``` 4. **匿名 (Anonymous Class)** 匿名是没有名字的局部,通常是基于接口或父动态生成的一种特殊形式。它可以在表达式中直接定义和初始化。 示例代码如下: ```java public class AnonymousClassExample { interface Action { void execute(); } public static void performAction(Action action) { System.out.println("操作开始..."); action.execute(); System.out.println("操作完成!"); } public static void main(String[] args) { performAction(new Action() { @Override public void execute() { System.out.println("执行匿名的操作逻辑"); } }); } } ``` --- #### 内嵌的优点 - 提高代码可读性:将辅助放在主内部,减少命名冲突。 - 增强封装性:内嵌可以直接访问外部的私有成员。 - 节省资源:对于仅限某个使用的,将其作为内嵌可以节省内存开销。 --- #### 注意事项 - 如果需要频繁使用某,则建议将其设计为顶层而非内嵌。 - 对于非静态内嵌,由于它隐含对外部实例的引用,可能会增加额外的内存消耗。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值