ThreadLocal的使用规则和底层源码解析,以及造成OOM的原因和解决方案
目录ThreadLocalThreadLocalMapThreadLocal.setThreadLocalMap.getMapThreadLocal.getThreadLocalMap.getEntryThreadLocal使用规范ThreadLocal此类提供线程局部变量。这些变量不同于普通的对应变量,因为每个访问一个(通过其get或set方法)的线程都有自己独立初始化的变量副本。ThreadLocal实例通常是类中的私有静态(private static (在java当中可以理解static就是全局
线程池ThreadPoolExecutor详解,Executor,拒绝策略对应使用规则源码解析
目录线程池ExecutorThreadPoolExecutor线程池参数int corePoolSize 核心线程数int maximumPoolSize 最大线程数long keepAliveTimeBlockingQueue workQueue 阻塞队列ThreadFactory threadFactory 线程工厂Executors.DefaultThreadFactory 线程池默认使用的线程工厂RejectedExecutionHandler handler 拒绝执行处理器(4种拒绝策略根接口)R
线程池execute,shutdown,shutdownNow方法源码解析,分析线程池执行策略,运行状态
ExecutorServicesubmit重载方法线程池有有两种提交任务的方法一种是execute由根接口Executor提供,第二种是ExecutorService提供的submit方法 该方法有三种重载方法,我们完全可以拿submit方法替代execute方法;本质上这四种方法最后都殊途同归都是调用execute方法submit执行的任务都是异步执行返回值为Future我们可以通过Future .get();获取异步任务执行的结果具体实现在AbstractExecutorService当值
ForkJoinPool和ForkJoinTask联用,示例解析
ForkJoinPoolForkJoin算法执行大概流程任务的拆分 fork,直到判断任务已经足够细粒度(原子任务),底层用到递归 类似微服务项目此时开始执行任务 当前被分解的任务不需要返回值那么任务完成则执行结束,当需要返回值时就会有下面的join操作:每个细粒度join完会和同层被fork的任务进行join得到返回的结果由此我们可以看出对于ForkJoinPool来说一个大任务会细分多个子任务,每个子任务可以继续划分多个子任务直到不能划分为主,当各个阶段的任务都执行完此时会合并各个阶段返回的
关于git提交代码报错:Push to origin/master was rejected
水深火热的艰苦奋斗以后,Push to origin/master was rejected推到主分支时被拒绝了原因是因为本地仓库和远程仓库的代码不一样。简单来说就是代码冲突了,复杂来说就是你动了不该动的代码。找到了问题所在,接下来就是解决bug的时间了,欢迎收听你的月亮,我的心…解决方案No.1一般代码冲突的问题,是你在代码里随手敲了个空格,tab,或者脸滚了一下键盘,导致代码中出现了原本不该有的东西。此时,你需要做的就是 Ctrl + z 一直撤销,将代码恢复,注意不要把你自己修改的代码也撤回了。
G1收集器概念,三色标记算法
G1垃圾两种回收模式Mixed GC:会同时对年轻代和部分的老年代进行收集全局并发标记(global concurrent marking)类似阈值当global concurrent marking 超过了这个比例 下次GC就会发生Mixed GC 当全局并发标记完其实此时就知道old区域的垃圾占比 超过改值就会发生Mixed GC也就是说当前老年代区域中的存活对象所占内存小于这个值(垃圾多于存活对象),超过了就说明改区域对象引用多于设置值就不用回收意思就是说最多能回收
AQS原理以及ReentrantLock如何应用AQS
AbstractQueuedSynchronizer (AQS)抽象的队列同步器提供一个框架,用于实现依赖于先进先出 first-in-first-out (FIFO)等待队列的阻塞锁和相关同步器(信号量、事件等)。这个类被设计成是大多数依赖单个原子整型来表示状态的同步器的有用基础形式(不同场景该整型值代表含义不同 具体通过子类来定义)。子类必须定义更改此状态的受保护(protected)方法,并定义该状态对于获取或释放此对象意味着什么。考虑到这些,这个类中的其他方法执行所有的排队和阻塞机制。子类可以维
并发场景多个线程统一全局超时时间
业务场景我需要请求算法那边获取多业务场景的的数据每个业务场景的数据都不相同但是由于是主链路的接口不想等待太长时间想共用500毫秒(可动态配置) 此时想到的解决方案。方法1自定义超时时间List<CompletableFuture<Integer>> list = new ArrayList<>(); //最大等待时间 long maxTime = 500L; //开始时间 long startTime
模仿Autowired生成一个自定义接口代理对象的后处理器
1.编写代理类package com.cx.test.demo.spring.proxy;import org.apache.commons.collections4.CollectionUtils;import org.apache.commons.collections4.MapUtils;import org.apache.commons.lang3.ArrayUtils;import org.springframework.beans.factory.NoSuchBeanDefiniti
InstantiationAwareBeanPostProcessor使用注意事项
注意 sprin bean的初始化跟jvm类加载不同sprin bean 是先实例化,在去初始化bean的属性,jvm是先初始化再去实例化(spring生命周期可以百度很多讲解)概念Bean创建过程中的“实例化”与“初始化”名词● 实例化(Instantiation): 要生成对象, 对象还未生成.● 初始化(Initialization): 对象已经生成.,赋值操作。BeanPostProcessor :发生在 BeanDefiniton 加工Bean 阶段. 具有拦截器的含义. 可以拦截.
usb调试与adb调试
之前没有太注意二者的区别,这里简单记录一下。usb调试,android应用开发或许经常会用到,之前我也是用这个方式来调试程序的,android设备如果是手机的话就很方便,设备打开usb调试,并用数据线连接电脑与android手机,你的android studio就能看到控制台有手机的日志输出了。如果android设备不是手机的话,就像android手表的话,或许就不支持usb这种方式了,这就需要...
新apk加入源码整编
第一步:编写Android.mk LOCAL_PATH:= $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE_TAGS := optional LOCAL_SRC_FILES := $(call all-java-files-under, src) LOCAL_PACKAGE_NAME := Bluetooth LOCAL_...
常见网络故障排查方法
1. 无法获取ip查看系统中实际是否有ip地址使用系统查询命令:busybox ifconfig下图是从网上找的,只是里面在比较重要的地方已标记:如果存在有地址,则不是底层问题,可往上层软件分析2. 服务端异常最常见的方式有如下几个:a.抓包,分析报文b.直接ping,tracert地址,看服务器是否返回,前提是服务器防火墙没有限制icmp报文c.系统命令busybox wge...
进入Recover后升级失败,提示unknown volume for path错误探索
为了实现u盘升级功能,但每次进入recovery升级都提示的是升级失败,最终我通过找到位于cache/recovery下的升级日志进行分析,摘取关键日志如下:I:no boot messages I:Got arguments from /cache/recovery/commandlocale is [zh_CN]can't open /dev/tty0: No such file or...
系统编译中LOCAL_CFLAGS的用法
LOCAL_CFLAGS += -DXXX ,相当于在所有源文件中增加一个宏定义#define XXXeg:在Android.mk中增加ifeq ($(PRODUCT_MODEL),XXX_A)LOCAL_CFLAGS += -DBUILD_MODELendif即能在所编译的Cpp文件中使用:#ifdef BUILD_MODEL....#endif...
Android 系统遥控器匹配kl文件
不同芯片对底层驱动的实现可能不同,但适配遥控器的时候,必定有一个步骤就是通过找到kl文件来匹配键值,如果kl文件有多个,如何找到自己所对应的那个呢,我的方法主要是以下两个步骤就可以确定:1.使用cat/proc/bus/input/devices命令查看所有的设备信息(root@test:/ # cat proc/bus/input/devices ...
周排行