phantomVK

Cease to struggle and you cease to live.

Java源码系列(25) -- LongAdder

一、类签名 利用一个或多个变量共同维护一个初始值为 0 的 long 总和。当调用 add() 时出现线程竞争,这些变量集分别动态增加,减少对同一个锁的竞争。 方法 sum() 或变量 longValue,返回当前用于维护总和变量集的总大小。 1 public class LongAdder extends Striped64 implements Serializable 在多线...

Linux终端走本地代理端口

1 2 3 4 alias HTTP_PROXY=" export http_proxy=http://localhost:1087" alias HTTPS_PROXY="export https_proxy=http://localhost:1087" alias UN_HTTP_PROXY="unset http_proxy" alias UN_HTTPS_PROXY="unset ...

Android动画内存泄漏原理

一、示例 ValueAnimator 持续输出从0到1000的整形值,然后反向输出1000到0数值,如此循环往复。该整形值转换为字符串设置到 TextView。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 class LeakActivity : AppCompatActivity() { override fun onCreate(savedInstanc...

Go1.13 下载依赖超时

用 go mod tidy 整理依赖时出现 github 第三方依赖io连接超时: 1 2 3 4 5 6 7 8 ~/backend/ginframe > go mod tidy go: downloading github.com/stretchr/testify v1.4.0 go: downloading gopkg.in/check.v1 v0.0.0-2016120818...

Java手写生产者消费者

BlockingQueue 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 public class Main { public static void m...

三个线程交替打印0到100

ReentrantLock + Condition 多个线程抢夺控制权,检查自己是否符合执行条件,若条件满足则执行输出,否则让出控制权唤醒其他线程。 这种方案有明显缺点:因 ReentrantLock 默认非公平锁,若多个线程抢夺时间片,热点线程有机会更频繁取得执行权。其次,被唤醒的线程不一定是符合执行条件的线程,所以会再次挂起,造成此次唤醒浪费的开销。 1 2 3 4 5 6 7 8...

两个线程交替打印0到100

synchronized + MONITOR 两个线程都在同一个 MONITOR 上等待和唤醒。如果只要求两个线程轮流打印,则只需调用 MONITOR.notify(); 唤醒另一个线程。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 public class ...

优雅地缩减APK体积

一、为何优化 安装包体积越小,则用户抗拒下载心理越弱,可提高确认下载率; 小安装包让用户下载时更主动允许流量下载,而无需延迟到Wifi; 从用户体验层面来说,小体积安装包减少下载时间,同时减少安装耗时; 安装包大小与安装后占用存储空间成正相关; 推广按照流量收费,安装包体积越小,推广成本越低; 如果交付产物是SDK,甚至会影响宿主安装包体积; 二、原因 ...

RecyclerView优化

一、数据拉取与处理 1.1 数据处理 大家都知道,数据从网络和本地磁盘加载到内存,为避免主线程阻塞会在io线程上进行。但绑定视图数据时,重量级转换操作也会导致列表滚动卡顿。如果能够预计算,如:字符串替换、拼接、类转换,数据填充到 Adapter 前和加载过程一并在 computation 线程完成转换。 1.2 数据缓存 ViewHolder 共享数据从 Adapter 获取公共变量...

Android注解处理器入门

基础工程 先创建名为 AnnotationDemo 工程,如果已有工程可直接跳过: 注解类组件 工程内新建名为 annotation 的模块。 此模块存放所有注解类,示例注解类名名为 XAnnotation。 1 2 3 4 5 6 7 8 9 import java.lang.annotation.ElementType; import java.lang.annotat...

优化应用启动内存

零、导读 笔者负责的工程长年进行功能迭代,没有处理性能问题,最近终于有空进行内存问题修复。本文记录此次内存问题定位过程及修复方法,并总结开发心得和经验。 应用频繁申请小对象,占用处理器时间片(虚拟机TLAB划分、对象初始化),样本超限令抽样工具卡顿崩溃。巨型对象、长周期对象 增加垃圾回收的时间,给调试处理器占用率、主线程阻塞增加未知风险。 一、目标 每次性能优化要明确阶段性目标,明确...

Android源码系列(26) -- MultiDex

一、介绍 1.1 功能 经过长期需求迭代、引入大量第三方代码库之后,构建的安装包包含海量方法。即便经过代码混淆,依然会在不久的将来遇到 Android64K方法数 问题。 官方对此这样解释: Android 应用 (APK) 文件包含 Dalvik Executable (DEX) 文件形式的可执行字节码文件,这些文件包含用来运行您的应用的已编译代码。Dalvik Execut...

基本生命周期

设备:Samsung Galaxy S4 系统:Android 5.0.1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 class MainActivity : AppCompatActivity() ...

Fix: Only fullscreen activities can request orientation

根据运行系统版本号重写 Activity.setRequestedOrientation(Int)。当版本号为 Android O 时不调用父类方法,避免父类检测条件并抛出异常。 1 2 3 4 override fun setRequestedOrientation(requestedOrientation: Int) { if (Build.VERSION.SDK_INT ==...

Java源码系列(24) -- HashMap死循环原理

一、现象 无论哪个JDK实现 HashMap,都不是线程安全。但开发者水平有限,使用 JDK7 HashMap 在多线程操作,或者别人在无意识下把含有 HashMap 的方法在多线程中调用,都将导致不可预测的问题。 由于服务端多线程并发的原因,调用 HashMap.get(K key) 的时候,会偶发处理器100%占用现象。 除了在服务端,Android 开发也偶尔需要 Map 上的多...