荏苒追寻个人博客

做一个有追求的青年


  • 首页

  • 关于

  • 标签

  • 分类

  • 归档

  • 日程表

Java 并发——Atomic相关类

发表于 2019-11-17 | 分类于 Java , 并发

https://rainmonth.github.io/posts/J1911174.html

为什么会有Atomic类

在单一的变量上应用对象锁(采用synchronized关键字)、ReentrantLock(可重入锁)有点大材小用了,于是Java针对单一变量就推出了一种lock-free-thread-safe工具集合,这就是Atomic相关类。Atomic相关类实现的核心思想就是CAS(compareAndSet)

1
2
3
4
5
6
7
/**
* @param expect
* @param update
*/
public final boolean compareAndSet(int expect, int update) {
return unsafe.compareAndSwapInt(this, valueOffset, expect, update);
}

其中valueOffset和Atomic类对象的内存地址有关,用来供底层获取Atomic对象当前的值(real值),所以这个过程是有三个值的:

  1. 内存中的实际值real;
  2. compareAndSet执行时期待expect值;
  3. 更新的值update;

更新的条件:
如果内存的值real和expect的值相同,说明符合条件,将update的值写入到内存。那么如果real值和expect不等咋办呢?不相等就一直等待,知道相等为止,这个过程中具有排他性,只有当compareAndSet执行完毕了,其他线程才有机会执行。

所以Atomic实现了高效无锁(不过底层还是用的排它锁,但底层处理比Java层处理效果要好得多),注意他的value字段是volatile的,任何线程修改后都会直接写到主内存中,保证了可见性。

Atomic 相关类

Atomic相关类主要有:AtomicInteger、AtomicBoolean、AtomicLong

Java 并发——Semaphore

发表于 2019-11-17 | 分类于 Java , 并发

https://rainmonth.github.io/posts/J1911173.html

引子

开启N个线程顺序打印a-z和A-Z如何实现?

Java 并发——基础

发表于 2019-11-17 | 分类于 Java , 并发

https://rainmonth.github.io/posts/J191117.html

摘要

说实话,本人在平常工作中关于Java并发的使用还是比较少的,为了提升下自己,就打算看看Java中对并发的支持,本文主要介绍一下java.util.concurrent包下并发相关的内容。该包下的内容大多数是java.util包下对应集合类的并发实现,可以通过比较来看看并发的妙处。

阅读全文 »

Java 并发——CountDownLatch

发表于 2019-11-17 | 分类于 Java , 并发

https://rainmonth.github.io/posts/J1911172.html

Java 并发——死锁

发表于 2019-11-17 | 分类于 Java , 并发

https://rainmonth.github.io/posts/J1911171.html

Java死锁

多个线程同时被阻塞,它们中的一个或者全部都在等待某个资源被释放。由于线程被无限期地阻塞,因此程序不可能正常终止。

死锁发生的条件

手写一个死锁

线程池死锁

揭开死锁

参考原因:

  • Java 死锁产生的原因及如何避免
  • Java面试必问-死锁终极篇

Java 并发——线程池

发表于 2019-11-17 | 分类于 Java , 并发

https://rainmonth.github.io/posts/J19111701.html

Java 线程池

阅读全文 »

Java 注解

发表于 2019-11-15 | 分类于 Java , 注解

https://rainmonth.github.io/posts/J191115.html

摘要

在分析ARouter源码的时候,看到ARouter-compiler模块里面涉及到了大量的注解处理,在看看现在流行比较广的框架,如ButterKnife、Dagger2都大量的用到了注解,还有AOP编程,也离不开注解的使用,所以本文主要介绍下Java注解的特性,从源码实现角度来了解注解处理的一般流程。本文主要从三个部分来阐述,分别是注解的基本概念及使用、运行时注解、编译时注解。

阅读全文 »

Android 开源库分析——ARouter使用及源码解析

发表于 2019-11-10 | 分类于 Android , 开源库分析

本文链接:https://rainmonth.github.io/posts/A191110.html

摘要

最近在学习项目组件化时用到了ARouter,本文先介绍ARouter的特性及基本使用,然后从源码的角度分析ARouter的实现原理。
注意本文分析的版本分别为:

  • arouter-api,1.5.0;
  • arouter-compiler,1.2.2
阅读全文 »

Android 工具命令——Gradle学习day2 Android项目里面的gradle配置解析

发表于 2019-11-06 | 分类于 Android , Gradle学习

https://rainmonth.github.io/posts/A191106.html

摘要

Gradle学习day1——基本的gradle命令中介绍了gradle的基本使用,本文从Android项目的角度来分析gradle在Android中的应用。新建Android项目后一般至少有两个build.gradle文件和一个setting.gradle文件,本文主要分析的就是这三个.gradle文件

阅读全文 »

Android SurfaceView详解

发表于 2019-11-03 | 分类于 Android , 控件

https://rainmonth.github.io/posts/A191103.html

摘要

本文分析的是API 24版本的SurfaceView(即Android N版本)通常情况下程序的View和用户响应都是在同一个线程(即主线程)中处理的,这就要求一些耗时操作(如网络请求、数据库查询)需要放在非UI线程中造作,否则就会造成ANR。View是通过刷新来重绘视图,系统通过发送VSSYNC信号来进行屏幕的重绘,这个信号的发送间隔是16ms,如果我们16ms内不能完成了绘制,就会表现出UI上的卡段。这就使得在一些逻辑很复杂或频繁更新的视图绘制方面显得比较吃力。那么到底能不能在非UI线程中进行绘制、更新、渲染UI的操作呢?怎么应对那种复杂层级或者频繁更新的UI绘制呢?关于这两个问题,接下来的SurfaceView会给我们答案。

阅读全文 »
<i class="fa fa-angle-left" aria-label="上一页"></i>1…141516…22<i class="fa fa-angle-right" aria-label="下一页"></i>

216 日志
43 分类
43 标签
GitHub
© 2025 Randy Zhang
由 Hexo 强力驱动
|
主题 — NexT.Gemini v6.1.0