Java多线程学习

JMM(Java Memory Model)

指令重排

程序在经过编译器编译之后形成的指令序列会被CPU和编译器进行优化,提升执行效率。

as-if-serial语义

不管怎么重排序(编译器和处理器为了提高并行度),(单线程)程序的执行结果不能被改变。编译器,runtime 和处理器都必须遵守 as-if-serial 语义。为了遵守 as-if-serial 语义,编译器和处理器不会对存在数据依赖关系的操作做重排序,因为这种重排序会改变执行结果。

sychronized学习

简介

synchronized是Java关键字,对代码块或方法进行修饰,实现一种简单的策略来防止线程干扰和内存一致性错误,如果一个对象对多个线程是可见的,那么对该对象的所有读或者写都将通过同步的方式来进行。具体表现如下:

  1. 提供一种锁机制,确保共享变量的互斥访问

  2. 包括monitorentermonitorexit两个JVM指令,它能够保证在任何时候任何线程执行到monitorenter成功之前都必须从主内存中获取数据,在monitorexit运行成功之后,共享变量被更新后的值必须刷入主内存

  3. 严格遵守happens-before规则,一个monitorexit指令之前必定要有一个monitorenter

Map学习

HashMap

以Java1.8源码为准,其数据结构如下:

  • 默认值
常量名 解释 默认值
DEFAULT_INITIAL_CAPACITY 初始容量 1 << 4(16)
MAXIMUM_CAPACITY 最大容量 1 << 30
DEFAULT_LOAD_FACTOR 负载系数 0.75
TREEIFY_THRESHOLD 超过该值的链表改用红黑树存储 8
UNTREEIFY_THRESHOLD resize时,如果红黑树存储的节点数小于该值则使用链表存储 6
MIN_TREEIFY_CAPACITY 链表节点数大于8个时,先判断当前存储的mapping数是否大于该值,如果小于则resize,大于则改用红黑树 64

JetPack-ViewModel

简介

根据官网介绍ViewModel主要作用是

The ViewModel class is designed to store and manage UI-related data in a lifecycle conscious way. The ViewModel class allows data to survive configuration changes such as screen rotations.
其生命周期如下图所示(以Activity为例,FragmentOnCreate()OnDetach()):

Activity/Fragment被认为是UI Controller, ViewModel把UI无关的逻辑操作进行封装,所以ViewModel不建议持有View/Lifecycle/Activity等对象。如果需要Context,使用AndroidViewModel,其持有Application引用。

JetPack-LiveData

概述

Google引入该组件的原因如下:

LiveData is a data holder class that can be observed within a given lifecycle.
This means that an {@link Observer} can be added in a pair with a {@link LifecycleOwner}, and
this observer will be notified about modifications of the wrapped data only if the paired
LifecycleOwner is in active state. LifecycleOwner is considered as active, if its state is
{@link Lifecycle.State#STARTED} or {@link Lifecycle.State#RESUMED}

原理简述

核心实现在LiveData抽象类中,该类重要成员变量如下:

  • mData: 持有的数据对象
  • mVersion: 数据对象的版本号,默认值是START_VERSION(-1)
  • mObservers: Map对象(Observer <--> ObserverWrapper),其中Observer定义了观察者接口,ObserverWrapper包含LifecycleOwnerObserver和版本号mLastVersion

注意:

根据LiveData#observe方法可以得出一个Observer只能在同一个LiveData注册一次,但可以在多个不同的LiveData中注册。

JetPack-Lifecycle

概述

帮助开发者构建生命周期(Fragment/Activity)可知的组件,主要代码在androidx.lifecycle包,建议使用implementation androidx.lifecycle:lifecycle-extensions:2.1.0ViewModel,LiveData一起导入。

Lifecycle把组件生命周期抽象成五种状态(Lifecycle#State枚举),状态之间通过六种事件(Lifecycle#Event枚举)发生状态变化,示意图如下: