- 博客(158)
- 资源 (8)
- 收藏
- 关注
原创 通过实例来透彻分析线程池的源码---ThreadPoolExecutor
讲线程池的原理之前,先得了解一下线程池中几个重要的概念。核心线程数 (corePoolSize):核心线程的数量;它的作用可以这样理解:向线程池中添加任务,如果线程池中的线程数量小于 corePoolSize,那么直接新建线程执行任务;如果线程池中的线程数量大于corePoolSize,那么就会往 阻塞队列workQueue中添加任务,此时如果阻塞队列满了且线程池中的线程数量小于最大线程数 maximumPoolSize,那么也会新建一个线程执行任务;如果阻塞队列满且线程数量大于最大线程数maxim
2020-10-27 19:05:08
662
原创 Android Binder 机制 实例分析
前言这里将讲述Binder机制的框架以及它是如何进行IPC通信的。一、Binder架构的组成1.1.Binder 框架 有3个方面组成: Binder服务端、Binder驱动以及客户端组成。Binder服务端:Binder 服务端实际上就是一个Binder 对象,该对象一旦创建就会开启一个隐藏的线程,该线程用来接收 Binder 驱动发送的消息,然后执行 onTransact函数,并根据 ...
2019-09-29 11:15:51
953
原创 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
1734
原创 全网最易懂的HashMap源码解析之一
前言:HashMap的用法是相当的广泛,之前就是用get和put,根本不了解其原理,现在随着工作的需要是必须要了解其原理的。我这里的源码是基于java8来分析的。java8中的HashMap的结构是有数组、单链表以及红黑树组成的,如果链表的节点个数大于8则分裂为红黑树,如下图: 图片是copy过来的。HashMap的主要属性如下://默认的容量,即默认的数组长度 16sta
2018-01-12 17:38:48
935
1
原创 一个实例让你彻底明白Activity的4种启动模式
首先,我们得有一个概念,就是启动的Activity都是放在相应的任务栈中。按Back键的时候Activity会从任务栈中返回,当任务栈为空时系统就会回收这个任务栈。那么我们为什么需要这4中启动模式呢?我们新建Activity的并在Androidmanifest.xml文件中注册的时候,默认的就是standard模式,如果你在这个Activity中一直通过startActivity来启动这个Ac
2017-08-03 14:46:54
4897
原创 Java高频面试之多线程:有4个线程分别获取C、D、E、F盘的大小,第5个线程统计总大小
前言:之前看到一个Java的面试题,最近在看《Java多线程编程核心技术》然后就试着去解决这道题,这里给出一个个人认为最简单的方法:主要用到的方法是:CountDownLatch, CountDownLatch类是一个同步倒数计数器,构造时传入int参数,该参数就是计数器的初始值,每调用一次countDown()方法,计数器减1,计数器大于0 时, await()方法会阻塞后面程序执行,直到计数器
2017-03-06 09:57:13
8176
4
原创 透彻理解 Java synchronized 对象锁和类锁的区别
synchronized 加到 static 方法前面是给class 加锁,即类锁;而synchronized 加到非静态方法前面是给对象上锁。这两者的区别我用代码来演示下:对象锁和类锁是不同的锁,所以多个线程同时执行这2个不同锁的方法时,是异步的。在Task2 中定义三个方法 doLongTimeTaskA和doLongTimeTaskB是类锁,而doLongTimeTaskC是对象锁。pub
2017-02-17 14:34:05
26019
9
原创 Jpa 删除之@Version注解的实体类无法删除的问题
这是因为JPA认为,version为空的数据可能是历史数据,或者是在并发修改过程中被其他事务删除的数据。在JPA中,如果一个实体类映射了一个数据库表,并且该表有一个版本字段,那么在执行删除操作时,JPA默认不会删除version为空的数据。当时在表里新增这列的时候,没有使用默认值,所以老数据 revision 值都为 null , 所以使用上面的方法就无法删除。结果发现,最新的数据都能从原表中删除,但是2年前的数据却无法删除,我是使用 jpa 中的。字段,对应实体类使用了。
2025-05-27 16:12:09
314
原创 鸿蒙Next如何自定义标签页
项目需求是展示标签,标签的个数不定,一行展示不行就自行换行。但是,使用鸿蒙原生的Grid后发现特别的难看。然后就想着自定义控件。找了官方文档,发现2个重要的实现方法,但是,官方的demo中讲的很少,需要自己去看去思考。效果图如下:需要计算整体布局的宽高,这和 Android 差不多。注意 margin 的计算/*** 自定义标签页面*/
2025-02-26 09:50:33
565
原创 鸿蒙Next通过oss上传照片到阿里云
最近在写纯血鸿蒙的APP,需要用到oss上传照片,之前的客户端 Android 和 IOS 都已经实现了,获取的阿里云签名的上传地址是服务端实现的,相信大部分公司都是这样的模式,服务端也是调用阿里云的SDK来实现的,这里就不说了。
2024-12-05 09:24:02
1466
原创 Android 断点续传显示进度的坑
之前有个需求就是打开APP的时候,判断当前版本是不是最新的,如果不是最新的就后台静默下载,下载完成后弹框让用户选择是否安装。需要支持断点续传,比如你下载了20%,退出APP进程,然后再次打开的时候从20%的位置继续下载而不是从头开始下载。代码很简单,我贴出来try {//获取下载文件的总大小 endPosition = conn . getContentLength();
2024-08-14 15:23:04
728
原创 Flutter 中的 Key 你真的了解吗?
最近在写一些Flutter的跨端应用,发现在同一个Column中使用2个TextFiled后,动态删除其中一个TextFiled后,发现里面填写的内容错乱了。然后我使用搜索大法,发现是我没有为这2个TextFiled设置不同的Key。秉着知其然,知其所以然的态度,我看了一些博客的分析,大部分都是很早之前的内容,且没有对照源码进行分析,有些博客的分析甚至是错误的,所以我对着源码来和Demo去一步步分析。
2024-05-21 10:37:35
1062
原创 MySql :优化总结一
------------------------------------------------- MySQL 行锁 -------------------------------------------------------------因为上面说过了,当 ‘字符串’和 ‘整型’比较的时候,会把 ‘字符串’类型先转化为‘整型’,产生幻读的原因是,行锁只能锁住行,但是新插入记录这个动作,要更新的是记录之间的“间隙”。我总结的加锁规则里面,包含了两个“原则”、两个“优化”和一个“bug”。
2024-01-10 10:57:19
691
原创 Java 三目运算符空指针异常
在写项目代码的时候,突然遇到了空指针,真是百思不得其解!= null?return id;你们觉得输出的结果是什么?大部分人可能跟我一样,觉得应该是null,对吧?但是,真是的结果确是保空指针异常了,如下:原因是为什么呢?原因是编译后包装类型会拆箱:= null?;= null?为空对象,调用自然会引用空指针异常!正确的写法应该是= null?;将基本类型**-1L** 改为 包装类型,这样就不会发生拆箱,也就不会发生空指针引用。希望大家使用三目运算符 且 两边类型不一致。
2024-01-04 13:25:20
780
1
原创 Vue axios Post请求 403 解决之道
刚开始请求的时候报 CORS 错误,通过前端项目配置后算是解决了,然后,又开始了新的报错 403。// // 设置js请求跨域解决try {// 获取 cookiereturn req;axios({'userName':"朱",",}),headers: {})
2023-12-27 16:56:02
3519
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
3824
原创 FastJson序列化导致的 “$ref“
刚转后端没多久,在通过RPC调用其他组的服务的时候,其他组对接的同学说,你的入参是有问题的,然后他把入参发我,类似于下面的json"roomNumber" : "1002" , "street" : "上海市徐汇区田林街道" } , "age" : 10 , "brotherMO" : {"$ref" : "$.addressMO" } , "className" : "上海中学" , "name" : "我是哥哥" } , "name" : "我是弟弟" }这个对象包含一个addressMO和。
2023-05-05 17:37:39
1517
原创 Android 下载安装APK踩坑纪录
最近项目中需要有个静默下载,下载完成后弹框告诉用户是否下载的需求。开始觉得 so easy!,真的调研写demo的时候发现过程还是蛮曲折的。下面会详细述说。
2023-04-07 10:14:02
1413
原创 Sping bean 的默认名称
满怀信心运行完上面的程序,依然会出现之前的错误,而如果改成 SQLiteDataService,则运行通过了。所以,显式引用 Bean 时,因为 DataService 的实现都是使用注解标记的,所以 Bean 名称的生成逻辑最终调用的其实是。一旦找出这些 Bean 的信息,就可以生成这些 Bean 的名字,然后组合成一个个 BeanDefinitionHolder 返回给上层。看案例的话,当我们启动基于 Spring Boot 的应用程序时,会自动扫描我们的 Package,以找出直接或间接标记了。
2022-11-15 18:30:23
1371
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
1024
原创 Android集成微信SDK不回调 WXEntryActivity 中的 onResp方法
集成微信SDK后,WXEntryActivity 中无法收到 onResp 回调的原因
2022-07-13 08:28:57
1291
原创 微信分享时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
4718
2
原创 RecycleView 实现携程酒店图片滑动到最后一张时跳转到相册
前言: 就是为了实现如下图的这种效果,滑动到最后一张图片时,跳转到该酒店的相册。实现方式就是使用 RecycleView 加上 PagerSnapHelper。PagerSnapHelper 的作用就是让 RecycleView 每次只能滑动一个 Item。Adapter 的最后一个加上如上图红框框出来的 View ,即下面的 STLview。在 STLView 里面会有个简单的动画效果。STLView 代码如下:public class STLView extends FrameLayout
2022-05-12 10:17:20
372
原创 线程池要点分析
一、为什么要线程池?直接使用线程不行吗?线程过多会带来额外的开销,包括线程的创建和销毁。线程的运行需要占用 CPU 的时间片,系统中处于运行状态的线程数量越多,那么每个线程单位时间内分配到的时间片就越少,线程调度带来的上下文切换就会越多,最终导致CPU真正用于计算的时间就会越少。直接使用的线程是无法复用的,而线程池是能够实现线程复用的。二、线程池的好处有哪些?降低资源消耗:线程池能够实现线程复用,那么就可以降低线程的创建和销毁造成的损耗。提高响应速度:当任务到达时,能够被等待任务的线程立即执
2022-05-09 10:41:23
448
原创 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
1752
原创 深刻理解什么是数字签名
数字签名是用来核实发送消息方身份的,能够确保消息没被篡改。数字签名采用的是非对称加密。举个例子,小明要给小红发送一份邮件:小明生成密钥对,公钥和私钥,公钥自己保存,不让任何人知道;公钥给小红。小明将邮件的内容通过 hash 算法生成数字摘要。小明使用私钥加密数字摘要生成数字签名。小明将要发送的内容和数字签名一起发送给小红。小红收到内容和签名后,使用公钥解密数字签名得到数字摘要 — a1。小红使用相同的 hash 算法将内容生成数字摘要 — a2,比较 a1 和 a2 是否相等,如果相等则说
2022-04-13 20:20:45
1538
原创 静态内部类为何能够实现单例?
public class DeviceHelper { private DeviceHelper() { } private static class DeviceHelperHolder { /** * jvm 虚拟机规定当主动 new 一个对象时会触发类的初始化,初始化阶段也就是执行类构造器 <clinit>()方法的过程; * <clinit>() 方法对于类来说不是必须的,如果一个类中既没有静态
2022-03-08 10:08:11
697
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
1269
原创 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
509
原创 深入浅出线:程池的线程回收--回收的是非核心线程吗?
写这篇文章的初衷是在和同事讨论线程池中线程去等待队列里面去取任务是随机的还是有序的,什么意思呢?举个例子,我自定义了下面一个线程池,如下:ExecutorService executorService = ThreadPoolExecutor( 2, 3, 60_000, Ti
2022-01-07 19:31:59
2205
原创 JVM之一:操作数栈和局部变量表
每个方法被执行的时候,JVM 都会在虚拟机栈中创建一个栈帧,栈帧是什么呢?一、栈帧栈帧(Stack Frame)是用于支持虚拟机进行方法调用和方法执行的数据结构,每一个线程在执行某个方法时,都会为这个方法创建一个栈帧。我们可以这样理解:一个线程包含多个栈帧,而每个栈帧内部包含局部变量表、操作数栈、动态连接、返回地址等。这里来说下 局部变量表的最大长度和操作数栈的最大深度。当一个方法开始执行的时候操作数栈是空的。操作数栈的最大深度在编译期就决定了。栈中的任何一个元素可以是任意的Java 类型
2021-12-17 17:34:27
1477
原创 深刻理解 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
790
原创 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
427
原创 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
3383
原创 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
515
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅