Java 多线程(三):同步代码块

0x0001 synchronize(this) 同步代码块

synchronize 同步方法在某些情况下会有一些弊端:比如 A 线程调用同步方法执行一个长时间的任务,那么 B 线程必须等待比较长的时间才可以获得对象锁。在这种情况下可以使用 synchronize 同步代码块可以解决。

synchronize 方法是对 当前对象 进行加锁,而 synchronize 代码块 是对 某一个对象 进行加锁,当然也包括当前对象。

SynchronizedMethodBlock 中的方法 one、two、three 分别展示了非同步情况、同步方法、同步代码块,通过日志打印可知同步代码块可以有效的避免同步方法执行的低效率。

Read More

Java 多线程(二):多线程并发

0x0001 synchronized 同步方法

为了避免多个线程同时访问 同一个对象 的实例变量时,可能发生的“非线程安全”问题,可以用 synchronized 修饰方法进行避免。在方法前添加 synchronize 关键字,使得多个线程在执行该方法时,以排队的方法排队处理。当一个线程想要执行同步方法中的代码时,线程首先尝试去获得方法上的锁,若能够拿到这把锁,该线程就可以执行该同步方法;否则,该线程就会不断的尝试去拿这把锁,直到拿到为止,而且有可能是多个线程同时去争抢这把锁。

Read More

Java 多线程(一):基本概念

0x0001 线程概述

线程可以理解为在进程中独立运行的子任务,使用多线程后可以最大限度的利用 CPU 的空闲时间来处理其他任务。多线程的执行是异步的。

0x0002 Thread 的常用 API

  • currentThread()(静态方法)

currentThread() 方法返回的 代码段正在被哪个线程调用

  • getName():获得线程的 Name

注意 currentThread().getName()getName() 的不同。

Read More

浅析 Java 对象拷贝

浅拷贝

浅拷贝是按位进行拷贝,它会创建一个对象,这个对象的属性为原对象一份复制。

在对象属性复制过程中不同的是:

  • 如果属性是基本数据类型,那么拷贝的就是基本数据类型的值;
  • 如果属性为引用数据类型,那么拷贝的就是引用类型所指向的内存地址。

也就是说原对象和拷贝对象的引用数据类型指向同一块内存地址,如果其中一个对象改变了这个内存地址,那么另外的一个对象也会改变。

Read More

AIDL 浅析

AIDL 是理解 Android 系统不可避免的知识点。

0x0001 自定义 AIDL

为了更加直观的展示相关内容,我们通过具体示例来展示相关的细节。

自定义一个 aidl 文件,里面定义方法(如:MyAidl.aidl),AS 会帮我们生产对于的类文件(MyAidl.java)。

Read More

浮点型数据的精度问题

如何表示定点数

使用二进制来表示十进制的编码称为 BCD 编码。 这种编码方式把小数点固定在某一位,所以其表示的数称为 定点数

那么 4 个比特最大的表示是十进制数为 9 (1001)。

32 bit 使用右侧的 2 个 0-9 的整数(8 bit),当成小数部分,左侧的6 个 0-9 表示整数部分(24 bit),那么 32 bit 可以表示 0到 999999.99 这样的数组范围。

Read More

如何使用 LeakCanary(1.6.3之前版本) 寻找内存泄漏位置

如何使用 Leakmemory 泄漏链路(Trace 图)

以下英文部分摘自 Youtube 视频:[Uber Mobility] Memory Leak Hunt: LeakCanary - Pierre-Yves Ricau

[19:30] You look for objects that you know you try to ask the question throught subject should be in memory or not. If you can anwser the question, it’s greate because you’re going to help you reduce the space of the problem. If the anwser is yes that it should be in memory, the problem is in blow, if the anwser is no, the problem is above.

Read More