自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(152)
  • 资源 (8)
  • 收藏
  • 关注

原创 通过实例来透彻分析线程池的源码---ThreadPoolExecutor

讲线程池的原理之前,先得了解一下线程池中几个重要的概念。核心线程数 (corePoolSize):核心线程的数量;它的作用可以这样理解:向线程池中添加任务,如果线程池中的线程数量小于 corePoolSize,那么直接新建线程执行任务;如果线程池中的线程数量大于corePoolSize,那么就会往 阻塞队列workQueue中添加任务,此时如果阻塞队列满了且线程池中的线程数量小于最大线程数 maximumPoolSize,那么也会新建一个线程执行任务;如果阻塞队列满且线程数量大于最大线程数maxim

2020-10-27 19:05:08 532

原创 Android Binder 机制 实例分析

前言这里将讲述Binder机制的框架以及它是如何进行IPC通信的。一、Binder架构的组成1.1.Binder 框架 有3个方面组成: Binder服务端、Binder驱动以及客户端组成。Binder服务端:Binder 服务端实际上就是一个Binder 对象,该对象一旦创建就会开启一个隐藏的线程,该线程用来接收 Binder 驱动发送的消息,然后执行 onTransact函数,并根据 ...

2019-09-29 11:15:51 703

原创 Android 启动模式二---组合Flag和launchMode

之前的文章讲了4种launchMode启动的Activity的区别以及通过设置taskAffinity来新建一个任务栈(launchMode 是singleTask 或 singleInstance)一个实例让你理解android的4种启动模式几种主要的Flag1. Intent.FLAG_ACTIVITY_CLEAR_TASK该模式必须配合FLAG_ACTIVITY_NEW_TASK一起...

2019-07-25 16:29:44 1411

原创 全网最易懂的HashMap源码解析之一

前言:HashMap的用法是相当的广泛,之前就是用get和put,根本不了解其原理,现在随着工作的需要是必须要了解其原理的。我这里的源码是基于java8来分析的。java8中的HashMap的结构是有数组、单链表以及红黑树组成的,如果链表的节点个数大于8则分裂为红黑树,如下图: 图片是copy过来的。HashMap的主要属性如下://默认的容量,即默认的数组长度 16sta

2018-01-12 17:38:48 752 1

原创 一个实例让你彻底明白Activity的4种启动模式

首先,我们得有一个概念,就是启动的Activity都是放在相应的任务栈中。按Back键的时候Activity会从任务栈中返回,当任务栈为空时系统就会回收这个任务栈。那么我们为什么需要这4中启动模式呢?我们新建Activity的并在Androidmanifest.xml文件中注册的时候,默认的就是standard模式,如果你在这个Activity中一直通过startActivity来启动这个Ac

2017-08-03 14:46:54 3878 4

原创 Java高频面试之多线程:有4个线程分别获取C、D、E、F盘的大小,第5个线程统计总大小

前言:之前看到一个Java的面试题,最近在看《Java多线程编程核心技术》然后就试着去解决这道题,这里给出一个个人认为最简单的方法:主要用到的方法是:CountDownLatch, CountDownLatch类是一个同步倒数计数器,构造时传入int参数,该参数就是计数器的初始值,每调用一次countDown()方法,计数器减1,计数器大于0 时, await()方法会阻塞后面程序执行,直到计数器

2017-03-06 09:57:13 8032 4

原创 透彻理解 Java synchronized 对象锁和类锁的区别

synchronized 加到 static 方法前面是给class 加锁,即类锁;而synchronized 加到非静态方法前面是给对象上锁。这两者的区别我用代码来演示下:对象锁和类锁是不同的锁,所以多个线程同时执行这2个不同锁的方法时,是异步的。在Task2 中定义三个方法 doLongTimeTaskA和doLongTimeTaskB是类锁,而doLongTimeTaskC是对象锁。pub

2017-02-17 14:34:05 25660 9

原创 MySql :优化总结一

------------------------------------------------- MySQL 行锁 -------------------------------------------------------------因为上面说过了,当 ‘字符串’和 ‘整型’比较的时候,会把 ‘字符串’类型先转化为‘整型’,产生幻读的原因是,行锁只能锁住行,但是新插入记录这个动作,要更新的是记录之间的“间隙”。我总结的加锁规则里面,包含了两个“原则”、两个“优化”和一个“bug”。

2024-01-10 10:57:19 550

原创 Java 三目运算符空指针异常

在写项目代码的时候,突然遇到了空指针,真是百思不得其解!= null?return id;你们觉得输出的结果是什么?大部分人可能跟我一样,觉得应该是null,对吧?但是,真是的结果确是保空指针异常了,如下:原因是为什么呢?原因是编译后包装类型会拆箱:= null?;= null?为空对象,调用自然会引用空指针异常!正确的写法应该是= null?;将基本类型**-1L** 改为 包装类型,这样就不会发生拆箱,也就不会发生空指针引用。希望大家使用三目运算符 且 两边类型不一致。

2024-01-04 13:25:20 421 1

原创 Vue axios Post请求 403 解决之道

刚开始请求的时候报 CORS 错误,通过前端项目配置后算是解决了,然后,又开始了新的报错 403。// // 设置js请求跨域解决try {// 获取 cookiereturn req;axios({'userName':"朱",",}),headers: {})

2023-12-27 16:56:02 1161 2

原创 本地服务器跨域问题 No ‘Access-Control-Allow-Origin‘ header is present on the requested resource 解决方法

请求方法为,状态值为302或403。报错信息如下:是请求,且,其实字段的类型为的 POST 请求,CORS规定,不属于以下类型的,都属于preflightrequest):text/plain发送""时,需要用到方法OPTIONS。

2023-10-08 15:12:19 2293

原创 FastJson序列化导致的 “$ref“

刚转后端没多久,在通过RPC调用其他组的服务的时候,其他组对接的同学说,你的入参是有问题的,然后他把入参发我,类似于下面的json"roomNumber" : "1002" , "street" : "上海市徐汇区田林街道" } , "age" : 10 , "brotherMO" : {"$ref" : "$.addressMO" } , "className" : "上海中学" , "name" : "我是哥哥" } , "name" : "我是弟弟" }这个对象包含一个addressMO和。

2023-05-05 17:37:39 1011 1

原创 Android 下载安装APK踩坑纪录

最近项目中需要有个静默下载,下载完成后弹框告诉用户是否下载的需求。开始觉得 so easy!,真的调研写demo的时候发现过程还是蛮曲折的。下面会详细述说。

2023-04-07 10:14:02 969

原创 Sping bean 的默认名称

满怀信心运行完上面的程序,依然会出现之前的错误,而如果改成 SQLiteDataService,则运行通过了。所以,显式引用 Bean 时,因为 DataService 的实现都是使用注解标记的,所以 Bean 名称的生成逻辑最终调用的其实是。一旦找出这些 Bean 的信息,就可以生成这些 Bean 的名字,然后组合成一个个 BeanDefinitionHolder 返回给上层。看案例的话,当我们启动基于 Spring Boot 的应用程序时,会自动扫描我们的 Package,以找出直接或间接标记了。

2022-11-15 18:30:23 1016 1

原创 Spring AOP异常:Error creating bean with name ‘org.springframework.aop.aspectj.AspectJPointcutAdvisor#0

Spring aop 报错: Error creating bean with name 'org.springframework.aop.aspectj.AspectJPointcutAdvisor#0'

2022-08-08 15:11:28 796

原创 Flutter 状态管理之Bloc下

Bloc 用于业务和UI分离实战

2022-08-05 13:54:05 685

原创 Flutter 状态管理之Bloc上

学习如何通过 Bloc 来实现简单的业务和 UI 分离

2022-08-04 08:56:25 745

原创 Flutter json 和 对象之间的转换

Flutter 中自定义对象和 json 之间的转换,包括嵌套对象和嵌套集合的序列化

2022-07-21 09:36:40 3701

原创 Android微信分享点击列表无响应的解决方法

微信分享时,点击微信联系人列表无响应

2022-07-15 10:58:15 888 2

原创 Android集成微信SDK不回调 WXEntryActivity 中的 onResp方法

集成微信SDK后,WXEntryActivity 中无法收到 onResp 回调的原因

2022-07-13 08:28:57 973

原创 微信分享时Uninitialized ActivityThread, likely app-created Instrumentation, disabling AppComponentFactory

集成微信SDK,分享时报错:E/Instrumentation: Uninitialized ActivityThread, likely app-created Instrumentation, disabling AppComponentFactory。

2022-07-11 08:45:36 3389 2

原创 RecycleView 实现携程酒店图片滑动到最后一张时跳转到相册

前言: 就是为了实现如下图的这种效果,滑动到最后一张图片时,跳转到该酒店的相册。实现方式就是使用 RecycleView 加上 PagerSnapHelper。PagerSnapHelper 的作用就是让 RecycleView 每次只能滑动一个 Item。Adapter 的最后一个加上如上图红框框出来的 View ,即下面的 STLview。在 STLView 里面会有个简单的动画效果。STLView 代码如下:public class STLView extends FrameLayout

2022-05-12 10:17:20 239

原创 线程池要点分析

一、为什么要线程池?直接使用线程不行吗?线程过多会带来额外的开销,包括线程的创建和销毁。线程的运行需要占用 CPU 的时间片,系统中处于运行状态的线程数量越多,那么每个线程单位时间内分配到的时间片就越少,线程调度带来的上下文切换就会越多,最终导致CPU真正用于计算的时间就会越少。直接使用的线程是无法复用的,而线程池是能够实现线程复用的。二、线程池的好处有哪些?降低资源消耗:线程池能够实现线程复用,那么就可以降低线程的创建和销毁造成的损耗。提高响应速度:当任务到达时,能够被等待任务的线程立即执

2022-05-09 10:41:23 316

原创 Gradle 几种依赖方式的区别

一、implementation : 依赖项在编译时对模块可用,并且仅在运行时对模块的消费者可用。什么意思呢? 假设 A 依赖 B,B 以 implementation 方式依赖 C,那么 C 在编译和运行时都对 B 模块可用,即编译和运行时模块 B 都可以调用模块 C 中的代码。但是,模块 A 就无法调用 C 的代码,会在编译时报错。二、api : 依赖项在编译时对模块可用,并且在编译和运行时对模块的消费者都可用。 假设 A 依赖 B,B 以 api 方式依赖 C,那么 A 在编译和运行时

2022-05-01 10:45:58 1446

原创 深刻理解什么是数字签名

数字签名是用来核实发送消息方身份的,能够确保消息没被篡改。数字签名采用的是非对称加密。举个例子,小明要给小红发送一份邮件:小明生成密钥对,公钥和私钥,公钥自己保存,不让任何人知道;公钥给小红。小明将邮件的内容通过 hash 算法生成数字摘要。小明使用私钥加密数字摘要生成数字签名。小明将要发送的内容和数字签名一起发送给小红。小红收到内容和签名后,使用公钥解密数字签名得到数字摘要 — a1。小红使用相同的 hash 算法将内容生成数字摘要 — a2,比较 a1 和 a2 是否相等,如果相等则说

2022-04-13 20:20:45 1230

原创 静态内部类为何能够实现单例?

public class DeviceHelper { private DeviceHelper() { } private static class DeviceHelperHolder { /** * jvm 虚拟机规定当主动 new 一个对象时会触发类的初始化,初始化阶段也就是执行类构造器 <clinit>()方法的过程; * <clinit>() 方法对于类来说不是必须的,如果一个类中既没有静态

2022-03-08 10:08:11 517 1

原创 happens-before中 volatile 原则详解

前言:本篇文章中主要讲解 happens-before 中关于 volatile 原则的理解。volatile 变量规则:对一个volatile域的写,happens-before 于任意后续对这个 volatile 域的读。一、volatile 关键字的作用:可见性:一个线程对共享变量的修改,另一个线程获取到的值一定是修改后的。测试代码如下:public class TestVolatile { static boolean stop = false; public stat

2022-01-14 18:00:07 734

原创 ThreadLocal内存泄漏的真正原因

注意:看这篇文章之前得对 ThreadLocal 有个大致的了解,不然看起来还是蛮吃力的。一、内存泄漏是因为弱引用吗?先说结果,内存泄漏的确是因为弱引用引起的,为什么呢?先看下 ThreadLocal 的 set 方法:public void set(T value) { Thread t = Thread.currentThread(); ThreadLocalMap map = getMap(t); if (map != null) map.set(th

2022-01-11 16:13:20 420

原创 深入浅出线:程池的线程回收--回收的是非核心线程吗?

写这篇文章的初衷是在和同事讨论线程池中线程去等待队列里面去取任务是随机的还是有序的,什么意思呢?举个例子,我自定义了下面一个线程池,如下:ExecutorService executorService = ThreadPoolExecutor( 2, 3, 60_000, Ti

2022-01-07 19:31:59 1572

原创 JVM之一:操作数栈和局部变量表

每个方法被执行的时候,JVM 都会在虚拟机栈中创建一个栈帧,栈帧是什么呢?一、栈帧栈帧(Stack Frame)是用于支持虚拟机进行方法调用和方法执行的数据结构,每一个线程在执行某个方法时,都会为这个方法创建一个栈帧。我们可以这样理解:一个线程包含多个栈帧,而每个栈帧内部包含局部变量表、操作数栈、动态连接、返回地址等。这里来说下 局部变量表的最大长度和操作数栈的最大深度。当一个方法开始执行的时候操作数栈是空的。操作数栈的最大深度在编译期就决定了。栈中的任何一个元素可以是任意的Java 类型

2021-12-17 17:34:27 1117

原创 深刻理解 Kotlin高阶函数、匿名函数以及lambda表达式

在说高阶函数之前,我们得知道什么是函数类型,啊,什嘛?不知道函数类型?那好吧,下面就说说什么是函数类型。一 、函数类型在 Kotlin 里面定义变量类型很简单,如下:var a :Int = 1 // Int 型变量var person :Person = Person() // 定义 Person 型变量那么函数类型应该是什么样的表现形式呢?有的,形式如下:(X, Y)-> Z,其中 X 和 Y 表示函数的参数,当然了,参数的个数任意,这里只写了2个,Z 表示函数的返回值。知道这种

2021-10-13 19:34:13 455

原创 Java高频面试:3个线程循环n次,每次分别输出A、B、C

前言:假设有3个线程,循环5次,每次各个线程依次输出A、B、C。如下:thread_1 : >>> Athread_2 : >>> Bthread_3 : >>> Cthread_1 : >>> Athread_2 : >>> Bthread_3 : >>> Cthread_1 : >>> Athread_2 : >>> Bthread_3 :

2021-09-30 12:05:56 331

原创 Handler延时消息是如何实现的?

首先,需要明确一点,Handler 延时消息机制不是延时发送消息,而是延时去处理消息;举个例子,如下:handler.postDelayed(() ->{ Log.e("zjt", "delay runnable");}, 3_000);上面的 Handler 不是延时3秒后再发送消息,而是将消息插入消息队列后等3秒后再去处理。postDelayed 的方法如下:public final boolean postDelayed(@NonNull Runnable r, long d

2021-09-27 21:15:12 2719

原创 Java 高频面试:2个线程分别依次输出数字和字母

如题:假设有A、B 2个线程,分别依次输出1a2b3c4d,A线程输出数字,B线程输出字母。下面有几种方法,感觉方法1是最容易想到的。方法1:synchronized 和 wait/notify/** * 使用 synchronized 和 wait notify */ private static void func1() { char[] num = new char[]{'1', '2', '3', '4'}; char[] str =

2021-09-27 09:15:57 373

原创 Semaphore 使用及源码分析

前言:之前的博文也做了一些关于AQS相关的线程同步的分析,这篇分析下 Semaphore 的使用和原理。一、Semaphore 的用法Semaphore就类似于许可证的概念,获取到许可就可以执行,不然就得等待。举个例子:一个超小型停车场只有3个车位,那么前3名来停车是可以获取到许可的,即可以停车;后面来的车辆必须要等前面的3辆车之一的出去,即释放许可。Semaphore semaphore = new Semaphore(2);semaphore.acquire() 默认的表示申请一个许可证,

2021-09-21 16:33:12 470 4

原创 ReentrantLock 以及 Condition深度解析

前言之前写过关于AQS的文章,也讲了关于 ReetrantLock 的源码分析。写ReentrantLock那么还是得提下 AQS 的。一、关于AQS 中几个重要的属性AQS 中维护了一个很重要的变量 state, 它是int型的,表示加锁的状态,初始状态值为0;另外 AQS 还维护了一个很重要的变量exclusiveOwnerThread,它表示的是获得锁的线程,也叫独占线程,ReentrantLock中的可重入就是用到该属性,当 state != 0 但是 exclusiveOwnerThre

2021-09-02 21:32:31 2339 3

原创 为什么多生产、消费者要使用notifyAll而不是notify

notify 和 notifyAll 的区别?1.线程调用了wait()方法,便会释放锁,并进入等待池中,不会参与锁的竞争2. 调用notify()后,等待池中的某个线程(只会有一个)会进入该对象的锁池中参与锁的竞争,若竞争成功,获得锁,竞争失败,继续留在锁池中等待下一次锁的竞争。3.调用notifyAll()后,等待池中的所有线程都会进入该对象的锁池中参与锁的竞争。锁池和等待池锁池:假设线程A已经拥有了某个对象(注意:不是类)的锁,而其它的线程想要调用这个对象的某个synchronized方法(

2021-08-23 21:01:58 329 2

原创 高频面试---drawable-xhdpi中的图片放到xxhdpi的手机上,内存是如何变化的

一、首先看几个基本概念● 分辨率:分辨率就是手机屏幕的像素点数,一般描述成屏幕的“宽×高”,安卓手机屏幕常见的分辨率有480×800、720×1280、1080×1920等。720×1280表示此屏幕在宽度方向有720个像素,在高度方向有1280个像素。● 屏幕大小 : 屏幕大小是手机对角线的物理尺寸,以英寸(inch)为单位。比如某某手机为“5寸大屏手机”,就是指对角线的尺寸,5寸×2.54厘米/寸=12.7厘米。● 屏幕密度:就是每英寸的像素点数,数值越高当然显示越细腻;就是屏幕对角线的长度 /

2021-01-20 19:07:59 2448 8

原创 Android 启动速度优化之--- 提高 ARouter 的初始化速度

如何提高 ARouter 的初始化速度在 app module 的 build.gradle 中 加入:apply plugin: 'com.alibaba.arouter'在项目的 build.gradle中加入:buildscript { repositories { jcenter() } dependencies { classpath "com.alibaba:arouter-register:1.0.2" }

2021-01-20 11:30:40 4340 12

原创 高频面试--RxJava线程切换的原理

前言最近跟朋友聊天,聊到了最近面试的高频题目就聊到了RxJava 的线程切换原理。我们Android 开发大部分应该 RxJava 都用的很6,RXJava + Retrofit + OkHttp 大礼包都用的贼6。自从用了 RxJava 之后 ,Handler 和 SyncTask 基本消失在日常代码中啦。所以本篇就从源码的角度分析 RxJava 线程切换的原理。注意:本篇的源码基于 RxJava 3.0.7, RxAndroid 3.0.0。还得配置基于JAVA8,否则会报错,因为RxAndroi

2021-01-14 11:40:48 2957 4

apk反编译工具

亲测可用的apk反编译工具。。。。。。。。。。。。。。。。。。。。

2017-11-20

帧动画素材

Android 帧动画的素材

2016-12-20

SwipeLayout侧滑点击删除

效果类似于QQ侧滑删除

2016-04-19

Android aidl 实现进程间通信

Android aidl 实现进程间通信(IPC)

2016-03-07

Android使用AIDL实现跨进程通信

Android使用AIDL实现跨进程的通信.rar

2015-12-31

Android viewpager 实现微博引导页

viewpager实现微博引导页,包含指示器"圆点",选中高亮,未选中则变暗

2015-12-25

可直接运行的随机森林的matlab代码

相当全的matlab的随机森林代码,有主程序和例子,部分64位的机器可能运行不了。需要的可以下载下,大家可以交流交流啊,

2013-06-13

用来决策级融合分类的matlab代码

用于遥感影像的决策级融合的adaboost 代码

2012-11-19

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除