黑马程序员 内部类

——- android培训java培训、期待与您交流! ———-

1,内部类概述

将一个类定义在另一类中,那么这个类就可以成为内部类

2,特点:

(a)内部类可以直接访问外部类的成员,包括私有成员
(b)而外部类要访问内部类中的成员必须要建立内部类的对象

3,格式:

Class Outer{
            Class Inner{}
}

外部类名.内部类名 变量 = 外部类对象.内部类对象
Outer.Inner oi = new Outer().Inner()

4,局部内部类–定义在方法中的类

格式:

Class Outer{
        Public void method{
Class Inner{}

注意:

(a)局部内部类访问局部变量,该变量必须被finay修饰(延长生命周期)

(b)局部变量会在方法调用完毕后,立马消失,而局部内部类如果还使用着局部变量,当方法消失后,这个方法区的内容还没有消失,也就 是说这个变量还必须存在,所以用final修饰,延长生命周期

5,匿名内部类概述

匿名内部类其实就是内部类的简写格式;其实匿名内部类就是一个匿名子类对象;没有名字的一个局部内部类。

使用前提:

内部类必须是继承一个类或者实现接口,换句话说这个内部类必须要和外部类或者接口要有关系,必须存在一个类,抽象类,或者接口。

格式:

new 类名或者接口名()
{重写类或者接口中的抽象方法}

体现

Class Outer
{
        Public void method()
        {
            new Inter()
            {
                Public void show()
                {
                    System.out.println("hao");
                }
            };
        }
}

优劣

(a)简化书写,覆盖父类的方法

(b)不可以直接调用匿名内部类自己的方法

(c)当父类的方法过多的话,那么不建议使用匿名内部类,阅读性差;匿名内部类里面的方法通常情况下不超过3个

——- android培训java培训、期待与您交流! ———-

源码地址: https://pan.quark.cn/s/d1f41682e390 miyoubiAuto 米游社每日米游币自动化Python脚本(务必使用Python3) 8更新:更换cookie的获取地址 注意:禁止在B站、贴吧、或各大论坛大肆传播! 作者已退游,项目不维护了。 如果有能力的可以pr修复。 小引一波 推荐关注几个非常可爱有趣的女孩! 欢迎B站搜索: @嘉然今天吃什么 @向晚大魔王 @乃琳Queen @贝拉kira 第三方库 食用方法 下载源码 在Global.py中设置米游社Cookie 运行myb.py 本地第一次运行时会自动生产一个文件储存cookie,请勿删除 当前仅支持单个账号! 获取Cookie方法 浏览器无痕模式打开 http://user.mihoyo.com/ ,登录账号 按,打开,找到并点击 按刷新页面,按下图复制 Cookie: How to get mys cookie 当触发时,可尝试按关闭,然后再次刷新页面,最后复制 Cookie。 也可以使用另一种方法: 复制代码 浏览器无痕模式打开 http://user.mihoyo.com/ ,登录账号 按,打开,找到并点击 控制台粘贴代码并运行,获得类似的输出信息 部分即为所需复制的 Cookie,点击确定复制 部署方法--腾讯云函数版(推荐! ) 下载项目源码和压缩包 进入项目文件夹打开命令行执行以下命令 xxxxxxx为通过上面方式或取得米游社cookie 一定要用双引号包裹!! 例如: png 复制返回内容(包括括号) 例如: QQ截图20210505031552.png 登录腾讯云函数官网 选择函数服务-新建-自定义创建 函数名称随意-地区随意-运行环境Python3....
<think>好的,我现在需要详细解释JVM中的CAS机制、原子类以及它们的使用场景。首先,用户提到了CAS机制和原子类,这两个都是并发编程中的关键概念。我应该从基础开始,逐步展开,确保结构清晰,同时符合用户给出的格式要求。 首先,CAS(Compare And Swap)机制是JVM中用于实现无锁并发操作的一种技术。我需要解释它的工作原理,包括比较和交换的步骤。这里需要提到CAS涉及到的三个操作数:内存地址、期望值和新值。当内存地址的值与期望值匹配时,才会更新为新值,否则不进行操作。这部分需要结合例子来说明,比如AtomicInteger的incrementAndGet方法是如何利用CAS实现的。 接下来是CAS的优缺点。优点包括减少线程阻塞,提高并发性能;缺点则是ABA问题、循环时间长带来的开销以及只能保证单个变量的原子性。需要引用用户提供的引用[3]中的ABA问题,说明这种情况可能带来的风险,比如在并发环境下,一个值从A变成B又变回A,CAS会误认为没有变化。这时候可能需要使用版本号或者AtomicStampedReference来解决。 然后是原子类部分。Java的java.util.concurrent.atomic包提供了多种原子类,比如AtomicInteger、AtomicLong、AtomicReference等。需要分别介绍这些类的用途,并举例说明它们的使用方法。例如,AtomicInteger的getAndIncrement方法是线程安全的,无需加锁。这里可以结合用户提到的引用[1],说明JVM如何通过本地方法(native方法)实现这些原子操作,底层可能依赖C/C++或硬件指令。 使用场景方面,需要明确在哪些情况下适合使用CAS和原子类。例如,计数器、状态标志的更新、构建无锁数据结构等。同时,要指出不适合的场景,比如涉及多个共享变量的复杂操作,这时候可能需要使用锁或其他同步机制。 最后,生成相关问题,确保问题覆盖了用户可能感兴趣的扩展内容,比如CAS的ABA问题解决方案、原子类与synchronized的比较、在分布式系统中的应用等。这些问题需要与之前的讲解内容相关联,帮助用户进一步学习。 需要特别注意格式要求:行内数学公式用$...$,独立公式用$$...$$,但当前内容可能不涉及数学公式,所以这部分可能不需要。但如果有相关公式,比如涉及到算法的时间复杂度,可能需要用LaTeX表示。不过根据用户的问题,可能暂时不需要数学表达式,但需要保持中文回答,正确引用标记,如[^3]对应引用中的CAS ABA问题。 总结步骤: 1. 解释CAS机制原理,优缺点,引用相关引用。 2. 介绍原子类的种类和用法,结合引用[1]中的native方法说明。 3. 分析使用场景,适合和不适用的案例。 4. 生成相关问题,覆盖机制、问题、比较和应用扩展。 需要确保语言简洁,结构清晰,分点说明,避免技术术语过于晦涩,让不同层次的读者都能理解。同时检查引用是否正确对应,比如引用[3]对应ABA问题,引用[1]对应native方法的实现。</think>### JVM中的CAS机制与原子类详解 #### 一、CAS机制原理 CAS(Compare And Swap)是一种无锁并发控制技术,通过**比较并交换**实现线程安全操作。其核心步骤如下: 1. 读取内存地址的当前值$V$。 2. 比较$V$与期望值$A$。 3. 若相等,将内存值更新为新值$B$;否则不操作并重试。 示例:`AtomicInteger`的`incrementAndGet()`方法通过循环CAS实现原子递增: ```java public final int incrementAndGet() { for (;;) { int current = get(); int next = current + 1; if (compareAndSet(current, next)) return next; } } ``` #### 二、CAS的优缺点 - **优点**:避免线程阻塞,提升并发性能。 - **缺点**: 1. **ABA问题**:值从$A→B→A$的变化可能导致CAS误判(可通过`AtomicStampedReference`添加版本号解决)。 2. **循环开销**:高竞争下频繁重试可能降低性能。 3. **单变量限制**:仅支持单个变量的原子操作。 #### 三、原子类的分类与使用 Java提供`java.util.concurrent.atomic`包,包含以下原子类: 1. **基本类型**: - `AtomicInteger`:原子整型操作。 - `AtomicLong`:原子长整型操作。 2. **引用类型**: - `AtomicReference`:原子更新对象引用。 - `AtomicStampedReference`:带版本号的引用,解决ABA问题[^3]。 3. **数组类型**: - `AtomicIntegerArray`:原子整型数组操作。 示例:使用`AtomicInteger`实现计数器: ```java AtomicInteger counter = new AtomicInteger(0); counter.incrementAndGet(); // 线程安全递增 ``` #### 四、使用场景 1. **适用场景**: - **计数器**:如统计请求次数。 - **状态标志**:如线程启停控制。 - **无锁数据结构**:如`ConcurrentLinkedQueue`(基于CAS的无锁队列)。 2. **不适用场景**: - **多变量原子操作**:需使用锁或`AtomicReference`封装。 - **复杂业务逻辑**:高竞争时可能导致性能下降。 #### 五、底层实现 原子类的CAS操作依赖JVM通过**native方法**调用底层CPU指令(如x86的`CMPXCHG`)实现[^1]。例如,`compareAndSet()`方法在JVM内部通过C/C++代码直接操作内存。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值