java进阶
文章平均质量分 89
JackOu1110
android开发工程师
展开
-
Android-IPC机制基础(一)
1. Android IPC简介 IPC是Inter-Process Communication的缩写,含义为进程间通信或者跨进程通信,是指两个进程间进行数据交换的过程。关于进程和线程的区别,在我之前发过的多线程并发总结录(一) – 线程进程基础中有详细叙述到。在Android程序中有一个主线程叫UI线程,只有在UI线程里面才能操作界面元素。很多时候,如果在UI线程执行很多耗时操作,严重影响了用户的体验,系统就会报出ANR异常(Application Not Responding)即应用无响应。 I原创 2021-01-28 16:52:43 · 225 阅读 · 0 评论 -
Handler机制详解
1.Handler的诞生由于Android采用的是单线程模式,开发者无法在子线程中更新 UI,因此在Android开发中,经常会在子线程中进行一些操作,当操作完成之后,将结果发送到主线程进行显示。探索其背后的模式:子线程、Handler和主线程三者组成了生产者和消费者模式。子线程负责生产数据,主线程负责消费数据,而Handler负责将数据从子线程抛到主线程中。详细见下图2.Handler相关的类Hanlder:发送和接收消息Looper:用于轮询消息队列,一个线程只能有一个LooperMess原创 2021-01-27 19:23:51 · 961 阅读 · 0 评论 -
垃圾回收机制(四)
1. 垃圾回收算法1.1 复制算法(Copying) 将可用内存按容量划分为大小相等的两块,每次只使用其中的一块。当这一块的内存用完了,就将还存活着的对象复制到另外一块上面,然后再把已使用过的内存空间一次清理掉。这样使得每次都是对整个半区进行内存回收,内存分配时也就不用考虑内存碎片等复杂情况,只要按顺序分配内存即可,实现简单,运行高效。只是这种算法的代价是将内存缩小为了原来的一半。 专家经过大量实验发现:新生代中的对象98%是“朝生夕死”的,所以并不需要按照1:1的比例来划分内存空间,而是将内存分原创 2021-01-27 13:26:15 · 172 阅读 · 0 评论 -
对Java对象的深入认识(三)
1. Java对象1.1 Java对象的组成 在HotSpot虚拟机中,对象在内存中存储的布局可以分为3块区域:对象头(Header)、实例数据(Instance Data)和对齐填充(Padding)。对象头包括两部分信息: 对象自身的运行时数据和类型指针运行时数据包含哈希码(HashCode)、GC分代年龄、锁状态标志、线程持有的锁、偏向线程ID、偏向时间戳等。《多线程并发总结(八)–Java内存模型》3.3小节有讲到线程运行的不同状态mark word的不同值类型指针,即对象指原创 2021-01-22 16:43:31 · 121 阅读 · 0 评论 -
可视化JVM理解运行时数据区(二)
1. 工具以及配置 要可视化代码在内存中的位置,以及虚拟机是如何划分运行时数据区的,我们需要使用到HSDB工具,该工具位于JDK\lib目录下。 我们需要的工具如下:JDK\lib目录下的sa-jdi.jarJDK\jre\bin目录下的sawindbg.dll动态库 (注意!!需要把这个动态库copy到JDK\lib) 工具准备好了,那就行动吧。Step1: 进入到JDK\lib,我的目录是:F:\Java\JDK\libStep2:打开命令行控制台Step3:运原创 2021-01-21 17:51:17 · 118 阅读 · 0 评论 -
JVM内存管理(一)
JVM与操作系统的关系1.JVM 基础1.1 Java Virtual Machine是什么 JVM 全称 Java Virtual Machine,也就是我们耳熟能详的 Java 虚拟机。它能识别 .class后缀的文件,并且能够解析它的指令,最终调用操作系统上的函数,完成我们想要的操作。1.2 JVM的作用是什么 JVM是一个抽象层,有了JVM,java代码就可以跨平台运行。JVM的作用主要是将字节码"翻译"成操作系统可以执行的指令代码。1.3 JVM、JRE、JDK的关系 JVM原创 2021-01-21 17:50:16 · 120 阅读 · 0 评论 -
Rxjava原理(二)--线程调度
1. 创建线程池和线程管理策略分析// 在开发中使用Rxjava来完成线程切换会调用到以下方法(还有几个就不一一列举了,原理一样的),那么就从这里开始分析Schedulers.io()Schedulers.computation()Schedulers.newThread()AndroidSchedulers.mainThread()当我们调用以上方法中的任意一个,都会调到Schedulers类中,Schedulers使用策略模式封装了所有线程切换策略(因此后面以io()分析)。// 1.原创 2021-01-19 13:49:29 · 282 阅读 · 0 评论 -
Rxjava原理(一)--响应式编程核心思想的实现
1.Rxjava的使用 关于Rxjava的使用,网上有太多太多,我这里把所有操作符汇总出来,大家有需要了解的自行查找用法,当然我也写了一点点使用方法,在文后的github链接中,这篇文章主要是想写写自己在学习Rxjava中做的笔记,希望能理解得更深刻。详细的使用方法文档传送门:git@github.com:oujie123/UnderstandingOfRxJava.git2.Rxjava思想 任何需求只有一个起点和一个终点,起点开始流向一个"事件","事件"经过处理之后最终流向终点,期间事件原创 2021-01-19 13:48:42 · 240 阅读 · 0 评论 -
多线程并发总结(八)--Java内存模型
1. 计算机原理 Java内存模型即Java Memory Model,简称JMM。JMM定义了Java 虚拟机(JVM)在计算机内存(RAM)中的工作方式。JVM是整个计算机虚拟模型,所以JMM是隶属于JVM的。Java1.5版本对其进行了重构,现在的Java仍沿用了Java1.5的版本。根据《Jeff Dean在Google全体工程大会的报告》我们可以看到计算机在做一些我们平时的基本操作时,需要的响应时间是不一样的。2. Java内存模型 从抽象的角度来看,JMM定义了线程和主内存之间原创 2021-01-15 14:31:12 · 125 阅读 · 0 评论 -
多线程并发总结(七) -- AQS
1. AQS是什么 队列同步器(AbstractQueuedSynchronizer,AQS),是用来构建锁或者其他同步组件的基础框架,它使用了一个int成员变量表示同步状态,通过内置的FIFO队列来完成资源获取线程的排队工作。并发包的大师(Doug Lea)期望它能够成为实现大部分同步需求的基础。2.AQS使用方式和其中的设计模式 AQS的主要使用方式是继承,子类通过继承AQS并实现它的抽象方法来管理同步状态,在AQS里由一个int型的state来代表这个状态,在抽象方法的实现过程中免不了要对同原创 2021-01-15 14:30:09 · 130 阅读 · 0 评论 -
多线程并发总结(六)--阻塞队列和线程池
1. 阻塞队列队列:是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。在队列中插入一个队列元素称为入队,从队列中删除一个队列元素称为出队。因为队列只允许在一端插入,在另一端删除,所以只有最早进入队列的元素才能最先从队列中删除,故队列又称为先进先出(FIFO—first in first out)线性表。阻塞队列是支持阻塞插入和支持阻塞移除原创 2021-01-15 14:28:50 · 364 阅读 · 0 评论 -
多线程并发总结(五)--并发编程
1. 死锁1.1 定义 死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁。1.2 产生死锁的必要条件互斥条件:指进程对所分配到的资源进行排它性使用,即在一段时间内某资源只由一个进程占用。如果此时还有其它进程请求资源,则请求者只能等待,直至占有资源的进程用毕释放。请求和保持条件:指进程已经保持至少一个资源,但又提出了新的资源请求,而该资源已被其它进程占有,此时请求进程阻塞,但又原创 2021-01-15 14:27:39 · 363 阅读 · 0 评论 -
多线程回忆总结录(四) --并发工具类
1 Fork/Join介绍 ForkJoin是实现多线程"分而治之"思想的框架,将一个大任务分成多个一个个小任务,然后对每个小任务执行并行计算,最后将结果合并起来。1.2 Fork/Join使用 在使用方面必须首先创建一个ForkJoin 任务。它提供在任务中执行fork 和join 的操作机制,通常不直接继承ForkjoinTask 类,只需要直接继承其子类。RecursiveAction,用于没有返回结果的任务RecursiveTask,用于有返回值的任务// 继承Recu原创 2021-01-13 09:11:03 · 101 阅读 · 0 评论 -
多线程回忆总结录(三) --线程间的协作
线程的协作1.线程间通知等待机制是什么? 通知等待机制是指一个线程A 调用了对象O 的wait()方法进入等待状态,而另一个线程B调用了对象O 的notify()或者notifyAll()方法,线程A 收到通知后从对象O 的wait()方法返回,进而执行后续操作。上述两个线程通过对象O 来完成交互,而对象上的wait()和notify/notifyAll()的关系就如同开关信号一样,用来完成等待方和通知方之间的交互工作。 notify(): 通知一个在对象上等待的线程,使其从wait 方法返回原创 2021-01-13 09:09:22 · 70 阅读 · 0 评论 -
多线程回忆总结录(二) -- 线程间共享
线程间的共享1. 内置锁Synchronized Java 支持多个线程同时访问一个对象或者对象的成员变量,关键字synchronized 可以修饰方法或者以同步块的形式来进行使用,它主要确保多个线程在同一个时刻,只能有一个线程处于方法或者同步块中,它保证了线程对变量访问的可见性和排他性,又称为内置锁机制。1.1 Synchronized的用法和用处 用处:有多个线程会修改到某个属性的地方,需要对修改处加锁,保证每次只有一个线程可以修改。1.2 对象锁 对象锁是用于对象实例方法,或者一个对原创 2021-01-13 09:07:12 · 106 阅读 · 0 评论 -
多线程回忆总结录(一) -- 线程进程基础
线程基础,线程之间共享与协作1.基础概念进程概念:进程是程序运行资源分配的最小单位进程是操作系统进行资源分配的最小单位,其中资源包括:CPU、内存空间、磁盘IO 等,同一进程中的多条线程共享该进程中的全部系统资源,而进程和进程之间是相互独立的。进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位。进程是程序在计算机上的一次执行活动。当你运行一个程序,你就启动了一个进程。显然,程序是死的、静态的,进程是活的、动态的。进程可以分为系统进程和用户进程。原创 2021-01-11 22:43:05 · 195 阅读 · 0 评论 -
Java反射学习笔记
反射1. 什么是反射? 主要是指程序可以访问、检测和修改它本身状态或行为的一种能力2. Java反射提供了什么能力? 在Java运行时环境中,对于任意一个类,都知道这个类有哪些属性和方法,对于任意一个对象都能调用它的任意一个方法。具体的能力如下:1.在运行时判断任意一个对象所属的类。2.在运行时构造任意一个类的对象。3.在运行时判断任意一个类所具有的成员变量和方法。4.在运行时调用任意一个对象的方法。3.反射的作用是什么? 反射可以在程序运行的时候,动态修改程序的某些属性,使得原创 2021-01-11 22:32:26 · 149 阅读 · 0 评论 -
代理模式:静态代理和动态代理详解
代理模式:静态代理和动态代理详解1. 静态代理2.动态代理1. 静态代理**1.1 定义:**代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用。通俗的来讲代理模式就是我们生活 中常见的中介。1.2 目的:(1) 通过引入代理对象的方式来间接访问目标对象,防止直接访问目标对象给系统带来的不必要复杂性;可以实现客户端和服务端解耦,方便替换真实实现的对象。(例如某项目使用了Volley网络请求,现在项目有一个特殊需求,要换成okhttp网络请求框架,使用代理模式可以很容易替换)原创 2021-01-07 16:40:20 · 361 阅读 · 1 评论