2021 是时候给自己加薪了!
一、定义:什么是线程安全性 当多个线程访问某个类时,不管运行时环境采用 何种调度方式 或者这些进程将如何交替执行,并且在主调代码中不需要任何额外的同步或协同,这个类都能表现出正确的行为,那么就称这个类就是线程安全的。 二、线程安全性的三个体现 原子性:提供互斥访问,同一时刻只能有一个线程对数据进行操作(Atomic、CAS算法、synchronized、Lock) 可见性:一个主内存的线程如果进行了修改,可以及时被其他线程观察到(synchronized、volatile) 有序性:如果两个线程不能从 happens-before原则 观察出来,那么就不能观察他们的有序性,虚拟机可以随意的对他们进行重排序,导致其观察观察结果杂乱无序(happens-before原则) 三、线程安全性:原子性 3.1、原子性 — Atomic包 在Java jdk中里面提供了很多Atomic类
由于CAS原语的直接操作与计算机底层的联系很大,CAS原语有三个参数, 内存地址、 期望值、 新值。我们在Java中一般不去直接写CAS相关的代码,JDK为我们封装在AtomicXXX中,因此,我们直接使用就可以了。
我们在 java.util.concurrent.atomic目录中可以看到我们这些类,包下提供了 AtomicBoolean、 AtomicLong、 AtomicInteger三种原子更新基本类型和一个比较好玩的类 AtomicReference,这些类都有一个共同点,都支持CAS,以 AtomicInteger为重点讲解。 可以看到,javac编译概要图主要分为如下几步:
如上就是注解处理器的核心机制,有了这个核心机制的认识我们就继续往下探索。 构建工具下 Annotation Processor 的本质 我们日常开发中(无论是 Java 后端还是 Android 移动端)总是多多少少会用到 JDK 提供的annotation processor能力,无论是什么构建工具(Gradle 或者 Maven 等)本质都是通过javac -processorpath命令参数显式指定哪些 Processer,或者显式声明META-INF/services/javax.annotation.processing.Processor来被javac发现并调用的(参见 google 的 AutoService 框架)。 正常情况下我们开发中使用及构建 Annotation Processor 技术都是上面几步走的方案,而且大多数照着网络上抄的都能正常工作,每次只用自己处理 process 就挺香的,因为只要按照规则声明放置,其他的 javac都能自己完美调用。 增强 javac 过程打印暴露问题 要解决一开始说的 Annotation Processor 中自己加的日志都不打印场景问题,我们需要获取一些额外的信息辅助定位。由于直接使用命令行javac的方式是最原始的操作,我们构建一般采用 Gradle,而 Gradle 的本质还是调用javac,所以下面我们以 Gradle 为例来分析如何定位 Annotation Processor 问题。
下面简单粗暴点就是直接在根目录的build.gradle中给所有模块添加参数: (编辑:惠州站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |