Java
文章平均质量分 81
7-brain
成长是一篇等待谱写的乐章,等待着我们谱写出一个个扣人心弦的乐符。
展开
-
面试官问你Java线程池--怎么样回答才能让面试官知道你真的懂了!
一.引言不管是Java面试还是Android面试,线程池都是面试官高频考察的点,那我们怎么回答,才能让面试官了解到我们是真的懂Java线程池了呢?这篇文章不涉及到线程池的使用和原理,如果你还不知道怎么使用线程池,可以先去了解一下。下面我会从几个方面入手循序渐进的告诉你怎么回答这一类问题,并切构建自己的知识体系。二.线程池是什么,为什么要有线程池?我们知道线程的创建和销毁都是十分消耗系统资源的,第一涉及到了用户态和核心态的切换,第二就是线程资源的回收。为了提高线程的复用和避免系统资源的浪费,所以就有了线原创 2021-10-24 14:43:57 · 1723 阅读 · 0 评论 -
手把手带你剖析ReentrantLock的底层实现AQS
一.引言在面试过程中发现很多人对synchronized关键字还能说出点东西,但是当问到ReentrantLock的时候,大部分的应试者的回答都是不知道。今天呢我们就手把手来剖析一下ReentrantLock的底层实现。让我们一起来阅读源码吧。二.ReentrantLock的使用ReentrantLock的使用我们就不多说了。 //默认非公平锁 ReentrantLock lock = new ReentrantLock(); //实现公平锁原创 2021-10-24 12:45:26 · 1130 阅读 · 0 评论 -
Activity页面的绘制流程
一.引言很多朋友都认为Activity的页面绘制是在Activity的onResume方法执行完成就被成功绘制成功了,认为这个时候我们就可以看到我们写的页面了。那真的是这样嘛?其实并不然,Activity的页面它制是在Activity的onResume方法执行完成后才会被绘制,且绘制完成的时长与我们主线当时的状态和布局的层级以及CPU内存都是有一定的关系,这些也是我们分析Activity启动黑屏...原创 2020-04-11 13:28:18 · 5242 阅读 · 0 评论 -
源码角度聊聊BlockCanary的原理
今天我们来说说BlockCanary的核心原理,BlockCanary是一个能检测主线程是否卡顿的框架。那么它为什么可以检测主线程卡顿呢?我们都知道Android是一个消息驱动型的系统。每当我们创建一个进程的时候,在ActivityThread内部都会为我们去创建一个主线程的Handler,然后开启消息的队列的轮询。**1.ActivityThead.main()** public...原创 2020-03-29 16:12:30 · 4513 阅读 · 0 评论 -
RxJava2.x源码解析(一)
一.引言说到RxJava,我相信现在每个Android开发者对他都有一定的了解。怎么使用,不是我们今天要讨论的,本着知其然必知其所以然的态度,我们来挖一挖RxJava背后的实现。今天我们就从一个最简单的例子入手,不涉及线程调度,线程调度的实现我们留着下次去了解。下面我们来举一个RxJava最简单的实现代码: Observable.create(new ObservableOnSubscr...原创 2019-04-11 12:32:59 · 456 阅读 · 0 评论 -
简单的包装一个线程池,存储所有任务的运行结果。
线程池,想必无论是做Android开发的还是做Java的对它都不陌生。它可以为我们提高线程的复用,默认情况下核心线程不会被销毁,避免了我们创建和销毁线程带来的开销。那我们如何去判断线程池中的任务执行完毕了呢?...原创 2019-03-12 19:01:09 · 381 阅读 · 0 评论 -
吐槽一下静态代理和装饰者模式的区别
今天我们来聊聊静态代理模式和装饰者模式的区别。一开始见到这两个模式的时候,第一感觉就是两个模式的实现方式不是大同小异么,然后带着疑惑在网上搜了搜资料,看到很多资料说他们区别于:代理模式主要目的在控制对象的访问。装饰者模式主要目的在于增加对象的行为。其实这句话是没错的。但是例举的例子就让人很摸不清头脑了,大概意思就是代理对象在编译期就已经确定了,而装饰者模式的装饰对象是在程序运行过程中才确定的。下...原创 2019-03-17 14:50:10 · 2039 阅读 · 1 评论 -
Android中Java多线程和单线程的执行效率对比
引言:众所周知的,线程是操作系统能够调度的最小单位。为什么需要多线程呢?因为我们的CPU的运算速度是非常的快的,在一个应用程序的运行过程中的大部分时间,都花在了,I/O操作,网络请求,和数据库操作上。如果没有多线程,我们的CPU大部分时间都是处于等待的状态,对CPU的资源造成了极大的浪费。多线程就是多个线程去共享CPU的时间片。一个CPU在一个固定的时间点,一个CPU只会处理一条线程中的指令。提...原创 2019-03-09 12:53:03 · 1326 阅读 · 0 评论 -
HashMap,ArrayMap,SparseArray 源码角度分析,Android中的数据结构你该如何去选择?
引言:Map集合,以key-value形式存储的数据结构,是我们在Android开发过程中经常需要用到的。除了java.util包下,为我们提供的HashMap是我们开发中经常使用的,Android也为我们提供了,两种以key-value形式存储的数据结构,一个是ArrayMap,一个是SparseArray。那么这三种Map集合我在日常的开发过程中该去如何抉择呢。下面让我来从源代码的...原创 2019-01-26 22:04:19 · 1412 阅读 · 1 评论 -
详解二叉搜索树(BST)的Java实现和五种遍历方式
树是一种典型的数据结构。今天我们来了解一下,一种特殊的树,二叉搜索树(BST),二叉搜索树在我们的实际开发过程中应用还是很广泛的,在我们的HashMap中,红黑树(一种特殊的二叉搜索树),是我们解决Hash冲突的一种方式。今天我们来好好了解一下我们的二叉搜索树。1.二叉搜索树的特征:对于树中的每一个节点,它的左子树中的节点值都小于该节点的值,而它的右子树中的节点值都大于该节点值。如下图所示...原创 2019-02-01 00:11:34 · 1607 阅读 · 0 评论 -
介绍几种等待多线程任务执行完毕的方法
一.引言:在我们日常的开发过程中,我们经常会开启多个线程或者创建一个线程池去执行多个并发任务,当所有任务执行完毕后,我们一般会做一个统一的处理。那我们如何直到多个线程的任务已经全部执行完毕了呢?今天由我来为大家介绍几种方法:二.join()方法 Thread thread1 = new Thread(new Runnable() { @Overrid...原创 2019-03-10 17:40:38 · 3892 阅读 · 0 评论 -
浅析Java字符串String和intern()方法,StringBuilder和StringBuffer区别。
String虽然不属于Java的八大基本类型,但是在我们的日常开发中,使用它的次数是很频繁的。但是我想问下大家你们真的了解String么?下面我从几个方面带大家重新了解下我们的String:1.不可变性我相信每个java开发者,都知道在我们java中的String它是不可变的。但是它的不可变性具体体现在哪呢?1.不可继承。2.对象不可变在我们的IDE中查看我们的String类,我们的...原创 2019-01-29 21:49:37 · 670 阅读 · 0 评论 -
源码角度详解Java中的优先队列PriorityQueue(堆的实现)
队列是一种先进先出的数据结构。而在优先队列中,元素被赋予优先级。当访问元素时,拥有最高优先级(或者最低)的元素首先被删除。今天我们来了解一下,Java中为我们实现了优先队列的类PriorityQueue。在了解PriorityQueue之前,我们要了解一下我们一种数据结构-堆。堆呢,通常是一个可以被看做一棵完全二叉树的数组对象。除了是一颗完全二叉树,堆还总满足一个条件:堆中某个节点的值总是不大于...原创 2019-02-03 00:39:32 · 2625 阅读 · 1 评论 -
你知道Java类什么情况下会被初始化吗?
引言:在我们Java中类的加载和连接过程都是在程序运行期间完成的。一般我们的类从它被加载到虚拟机内存,和到被卸载出内存为止:它的生命周期可以细分为:加载 - 验证 - 准备 - 解析 - 初始化 - 使用 - 卸载。我们统一把验证,准备,和解析阶段统称为连接阶段。一般我们说的类加载完成包括三个阶段,加载 - 连接 - 初始化。下面我们就来了解了解这三个阶段做了哪些事。1.加载阶段加载阶段...原创 2019-01-27 20:50:50 · 1812 阅读 · 0 评论 -
单例模式详解
单例模式在我们日常开发中,是我们最常见到的设计模式了。实现单例模式的方法有很多,有些人虽然会写,但是对为什么这么写,还是一点不明白。下面我来给大家讲讲单例模式为什么这么写,有什么好处。实现单例模式呢,一般有以下几个关键点:(1)私有的构造函数(无法通过new创建实例)(2)通过静态方法或者枚举提供对象的实例(3)确保单例对象只有一个(考虑多线程情况下)。有时候在实现单例模式...原创 2019-01-24 20:46:48 · 861 阅读 · 0 评论 -
Java关键字synchronized的使用
今天我们来聊一聊java关键字synchronized。相信大家对这个关键字,一定不是很陌生,synchronized是我们在开发过程中保证多线程安全的一种重要手段。那什么是线程安全呢?简单的说就是当多个线程同时访问这个对象都能得到正确的结果。在解释synchronized之前,我们先来看看下面这段代码。 List<Thread> thread原创 2019-01-26 01:00:08 · 1002 阅读 · 0 评论