
Java
Java
抓手
这个作者很懒,什么都没留下…
展开
-
maven 依赖的优先级
工程中依赖了a、b两个jar包,在a jar包内引用了b jar包版本为1.0,路径为:Project > a > b(1.0)工程中直接依赖的b jar包版本为2.0,路径为:Project > b(2.0)由于b(2.0)路径最短,所以项目使用的是b(2.0)。原创 2025-04-11 14:32:21 · 204 阅读 · 0 评论 -
线程池中异常处理,解决多线程异常丢失问题
线程池的提交方式有submit和executeexecute没有返回值,并且会打印异常信息或者使用try-catchsubmit源码在底层还是调用的execute方法,只不过多一层future封装,future里面的run方法try-catch了所有的异常,通过setException(ex)方法设置到了变量outcome里面, 可以通过future.get获取到outcome。原创 2023-11-23 10:50:56 · 1243 阅读 · 1 评论 -
Java 并发包 park/unpark原理
park(Object blocker) 和 unpark(Thread thread) 方法位于Java 并发包下的 java.util.concurrent.locks.LockSupport 类,本质上是对 Unsafe 的park/unpark 方法的简单封装,它是 Lock(AQS)的基石,给 Lock(AQS)提供了挂起/恢复当前线程的能力。原创 2023-11-16 13:51:47 · 380 阅读 · 0 评论 -
cron表达式 字符含义 详细解释
cron表达式是一个字符串,由6到7个字段组成,用空格分隔。其中前6个字段是必须的,最后一个是可选的。原创 2023-06-19 11:17:51 · 731 阅读 · 0 评论 -
Java CAS和AQS的实现原理
CAS(Compare And Swap)是一种并发控制机制,用于解决多线程并发访问共享资源时的数据一致性问题。在Java中,CAS操作通常使用Atomic类来实现。例如,可以使用java.util.concurrent.atomic.AtomicInteger类来实现对整数类型的原子操作。Atomic类提供了一系列的原子操作方法,例如getAndAdd、getAndSet、compareAndSet等,可以用于实现CAS操作。/***/原创 2023-05-24 14:05:58 · 651 阅读 · 0 评论 -
系统CPU飙升 三步快速定位问题
找到最耗CPU的进程top -c找到最耗CPU的线程top -Hp 查看堆栈jstack | grep '' -C100 --color原创 2023-02-27 15:36:37 · 514 阅读 · 0 评论 -
使用线程池时,多线程之间上下文参数传递失效解决办法
问题描述在执行业务代码时,有时候需要异步处理一些业务,在异步线程中获取当前登录的用户信息失败。因为用户信息是在过滤器或拦截器中解析出来并设置到ThreadLocal中的,子线程是无法获取到ThreadLocal中的值的。虽然可以使用InheritableThreadLocal替代ThreadLocal,但是只能在新创建的线程中使用。对于线程池也会失效,因为线程池中的线程是由线程池创建好并可重复利用,这时InheritableThreadLocal的值传递就失去意义了。解决办法自定义线程池和线程池执原创 2023-01-12 14:52:49 · 2159 阅读 · 0 评论 -
Thread.sleep(0) 有什么用
Thread.sleep()是native方法。一个线程在运行native方法后,返回到Java线程时,必须进行一次safepoint检查。程序只有达到safepoint才会STW,从而进行GC。Thread.sleep(0)可以让线程进入safepoint检查,从而触发GC。原创 2023-01-09 10:48:55 · 493 阅读 · 0 评论 -
Java 使用CountDownLatch实现网络同步请求,异步同时获取商品信息组装
CountDownLatch 是一个同步工具类,用来协调多个线程之间的同步,它能够使一个线程在等待另外一些线程完成各自工作之后,再继续执行。原创 2023-01-04 14:23:45 · 456 阅读 · 0 评论 -
Java 集合多条件多规则排序 升序 降序 空值处理
List orderShopList = list.stream().sorted(Comparator // 先按数量降序(由于是降序,nullsFirst()方法会将null值放在后面) .comparing(Shop::getCount, Comparator.nullsFirst(Integer::compareTo).reversed()) // 然后按价格升序(由于是升序,原创 2022-12-02 09:56:43 · 2543 阅读 · 0 评论 -
Java 日志中找不到自定义线程的原因,线程名显示不全
原因是日志中使用固定长度格式展示线程名,长度固定为15位字符,在[]里面。当线程名超过15位时会截取,删除最前面的字符直到线程名等于15位字符。eg:线程名为xzhThreadExecutor-0,会变为[hreadExecutor-0]当线程名不足15位时会补全,自动填充空字符直到达到15位字符。eg:线程名为xzhThread-0,会变为[ xzhThread-0]原创 2022-11-14 09:57:40 · 971 阅读 · 0 评论 -
长轮询和长连接
长轮询客户端向服务端发送请求,服务器端不会直接响应,而是先将这个请求挂起,然后判断服务器端数据是否有更新。如果有更新,则响应,如果一直没有数据,则达到等待超时时间才返回。案例:消息队列、配置中心等长连接长连接即HTML5 SSE,客户端和服务端建立连接后不进行断开,后续的交互一直复用这条连接通道,连接不会主动关闭。案例:视频播放原创 2022-10-17 16:18:30 · 283 阅读 · 0 评论 -
Java List Map 遍历通过条件删除元素
Java List Map 遍历通过条件删除元素原创 2022-09-28 18:49:40 · 1182 阅读 · 0 评论 -
Java获取HTTP请求参数 包括form表单、json格式、xml格式
Java获取HTTP请求参数 包括form表单、json格式、xml格式,并将参数转为map或json等格式原创 2022-08-23 11:15:21 · 2924 阅读 · 0 评论 -
OutOfMemoryError 内存溢出问题排查
java.lang.OutOfMemoryError: Java heap spacejava.lang.OutOfMemoryError: PermGen spacejava.lang.OutOfMemoryError: Requested array size exceeds VM limitjava.lang.OutOfMemoryError: request bytes for . Out of swap spacejava.lang.OutOfMemoryError: (Native me原创 2022-07-20 14:32:36 · 900 阅读 · 0 评论 -
内存溢出和内存泄漏的区别
内存溢出(Out Of Memory),是指程序在申请内存时,没有足够的内存空间供其使用,出现OutOfMemoryError,即OOM。内存泄露(Memory Leak),是指程序在申请内存后,无法释放已申请的内存空间。当内存泄露大量堆积将内存占满后最终会造成内存溢出。...原创 2022-07-20 13:43:35 · 482 阅读 · 0 评论 -
Java 一次for循环和多次stream封装参数速度对比
List ids = orderList.stream().map(Order::getId).collect(Collectors.toList()); List nos = orderList.stream().map(Order::getOrderNo).collect(Collectors.toList()); Set chargeObjectCodes = orderList.stream().map(Or原创 2022-07-19 17:02:48 · 1272 阅读 · 0 评论 -
Java 类隔离 解决依赖冲突 NoSuchMethodError
类隔离技术是为了解决依赖冲突而诞生的,它通过自定义类加载器破坏双亲委派机制,然后利用类加载传导规则实现了不同模块的类隔离。原创 2022-06-28 15:17:55 · 638 阅读 · 0 评论 -
ArrayList为什么线程不安全
ArrayList add源码 /** * Appends the specified element to the end of this list. * * @param e element to be appended to this list * @return <tt>true</tt> (as specified by {@link Collection#add}) */ public boolean原创 2022-05-31 11:46:06 · 198 阅读 · 0 评论 -
JVM GC信息查看、内存使用情况查看
系统资源整体使用情况top内存的使用情况jmap -histo <pid>jmap -histo:live <pid> | grep <关键字> | head -100[C 表示char[],一般与String对象相关,因为String其实就是基于char数组实现的[S 表示short[][I 表示int[][B 表示byte[][Z 表示boolean[][J 表示long[][F 表示f...原创 2022-05-26 10:05:26 · 927 阅读 · 0 评论 -
Java随机生成中文姓名工具
import java.io.UnsupportedEncodingException;import java.util.Random;/** * @author 向振华 * @date 2022/04/10 11:35 */public class RandomNameUtils { /** * 随机获取姓名 * * @return */ public static String fullName() { retur.原创 2022-04-11 14:03:14 · 2493 阅读 · 0 评论 -
Java程序生成可执行的exe文件 详细图文教程
工具准备1.Java编辑器,如:idea、eclipse等,下载地址:IntelliJ IDEA: The Capable & Ergonomic Java IDE by JetBrainshttps://www.jetbrains.com/idea/2.exe4j,下载地址:ej-technologies - Java APM, Java Profiler, Java Installer Builderhttps://www.ej-technologies.com/download/exe4j原创 2022-01-19 17:25:27 · 45992 阅读 · 23 评论 -
服务部署异常 Trying to load META-INF/validation.xml HV000234: Using org.hibernate.validator.messageinterpo
15:04:34.597 [background-preinit] DEBUG org.jboss.logging - Logging Provider: org.jboss.logging.Log4j2LoggerProvider15:04:34.605 [background-preinit] INFO org.hibernate.validator.internal.util.Version - HV000001: Hibernate Validator 6.0.16.Final15:04:34.原创 2021-12-02 15:45:20 · 2453 阅读 · 1 评论 -
BigDecimal加减乘除、比较大小、保留小数位
简单加减乘除 public static void main(String[] args) { BigDecimal a = new BigDecimal("8"); BigDecimal b = new BigDecimal("4"); System.out.println("a = " + a); System.out.println("b = " + b); // 加法 BigDecimal原创 2021-10-09 17:23:49 · 1957 阅读 · 0 评论 -
Java最全配置.gitignore文件忽略规则
# Compiled class file*.class# Log file*.log# BlueJ files*.ctxt# Mobile Tools for Java (J2ME).mtj.tmp/# Package Files*.jar*.war*.nar*.ear*.zip*.tar.gz*.rar# Eclipse & IntelliJ IDEA.classpath.settings/.idea.idea/*.iws*.iml*.i.原创 2021-08-12 10:02:30 · 2702 阅读 · 1 评论 -
Java忽略警告注解@SuppressWarnings
// 忽略全部类型的警告@SuppressWarnings("all") // 忽略未检查的转化,例如集合没有指定类型的警告@SuppressWarnings("unchecked") // 忽略未使用的变量的警告@SuppressWarnings("unused") // 忽略与使用Closeable类型资源相关的警告@SuppressWarnings("resource") // 忽略在类路径,原文件路径中有不存在的路径的警告@SuppressWarning...原创 2021-08-04 15:44:47 · 5880 阅读 · 7 评论 -
加锁就一定能保证线程安全吗?
也就只有面试才会问出这种问题,这个问题不能简单回答是否,所有的面试问题都不能简单的回答是否,而应该讲清楚其中的原委,才能达到面试的目的。回答这个问题首先要搞清楚什么才是线程安全的呢在JMM内存模型中,有主内存和工作内存的概念,线程对数据的操作是将数据从主内存读取到当前线程的工作内存,修改后再刷到主内存,这过程可能导致另外的线程本地的工作内存中的数据没有及时更新而产生错误的操作,这就是线程安全问题。简单点说,线程安全是指在多线程环境下,能够正确的操作共享数据。怎么保证线程安全一般..原创 2021-05-17 17:42:16 · 1850 阅读 · 19 评论 -
微信小程序获取手机号
1.获取微信用户绑定的手机号,需先调用wx.login接口,获取code。2.因为需要用户主动触发才能发起获取手机号接口,所以该功能不由API来调用,需用button组件的点击来触发,获取encryptedData、iv。<button open-type="getPhoneNumber" bindgetphonenumber="getPhoneNumber"></button>Page({ getPhoneNumber (e) { console.log(e原创 2021-05-12 14:11:44 · 736 阅读 · 8 评论 -
两步实现微信小程序登录 获取openid和session_key
1.前端调用wx.login()获取临时登录凭证code,并回传到后台服务。wx.login({ success (res) { if (res.code) { //发起网络请求 wx.request({ url: 'https://example.com/onLogin', data: { code: res.code } }) } else { console..原创 2021-05-11 14:09:01 · 1977 阅读 · 3 评论 -
领域模型命名规约:POJO、DTO、VO、BO、PO、DO
POJO(Plain Ordinary Java Object)简单Java对象是对DTO/VO/BO/PO/DO的统称。DTO(Data Transfer Object)数据传输对象不同服务或服务层之间的数据传输,如:RPC接口参数、Controller层的请求参数。VO(Value Object、View Object)值对象、展示对象返回给前端的值对象,如:Controller层的响应参数。BO(Business Object)业务对象可能包含多个表的数据,也..原创 2021-04-26 10:16:49 · 1786 阅读 · 5 评论 -
字符串拼接还在用String、StringBuilder?试试StringJoiner吧
StringJoiner是JDK1.8新出的一个类,用于拼接字符串时加入分隔符、前缀、后缀。不需要手动拼接这些与业务无关的符号,也省去处理边界问题的麻烦。使用说明例子:将数组中的元素拼接成以","分割的字符串String[] strings = new String[]{"a", "b", "c"};拼接结果:a,b,c使用StringJoiner之前 public static void main(String[] args) { String[] str原创 2021-04-16 11:08:40 · 974 阅读 · 4 评论 -
Java线程池七个参数详解:核心线程数、最大线程数、空闲线程存活时间、时间单位、工作队列、线程工厂、拒绝策略
源码简介ThreadPoolExecutor是JDK中的线程池实现,这个类实现了一个线程池需要的各个方法,它实现了任务提交、线程管理、监控等等方法。来看看ThreadPoolExecutor类的构造方法源码,其他创建线程池的方法最终都会导向这个构造方法。共有7个参数:corePoolSize、maximumPoolSize、keepAliveTime、unit、workQueue、threadFactory、handler,下面将对这7个参数展开讲解。 public ThreadPool原创 2021-04-11 22:28:48 · 62745 阅读 · 39 评论 -
ConcurrentHashMap是如何保证线程安全的
JDK1.7,采用分段锁技术本质上还是采用数组+链表的形式存储键值对的。为了提高并发,把原来的整个 table 划分为 n 个 Segment 。从整体来看,它是一个由 Segment 组成的数组。每个 Segment 里边是由 HashEntry 组成的数组,每个 HashEntry之间又可以形成链表。我们可以把每个 Segment 看成是一个小的 HashMap,其内部结构和 HashMap 是一模一样的。当对某个 Segment 加锁时,不会影响到其他 Segment 的读写,降低锁的竞争。J原创 2021-04-09 13:42:10 · 2279 阅读 · 7 评论 -
HashMap为什么线程不安全
JDK1.7中,HashMap的put方法采用的是头插法,在resize扩容时会形成环形链表,造成死循环。扩容时还可能造成数据丢失。JDK1.8中,HashMap将put方法改成了尾插法,不会形成环链死循环,但是会造成数据覆盖。...原创 2021-04-09 11:08:48 · 483 阅读 · 1 评论 -
零拷贝技术
DMA(Direct Memory Access)直接内存访问技术:在进行 I/O 设备和内存的数据传输的时候,数据搬运的工作全部交给 DMA 控制器,而 CPU 不再参与任何与数据搬运相关的事情,这样 CPU 就可以去处理别的事务。零拷贝(Zero-copy):通过 DMA 将磁盘上的数据拷贝到内核缓冲区里,然后将缓冲区描述符和数据长度传到 socket 缓冲区,网卡的 SG-DMA 控制器就直接将内核缓存中的数据拷贝到网卡的缓冲区里。零拷贝技术的文件传输方式相比传统文件传输的方式,减少了 2 次原创 2021-04-06 11:08:03 · 438 阅读 · 0 评论 -
互联网黑话大全 最新词汇 黑话生成器
二字动词复盘 赋能 沉淀 倒逼 落地 串联 协同 反晡 兼容 包装 重组 履约 晌应 量化 发力 布局 联动 细分 梳理 输出 加速 共建 支撑 融合 聚合 集成 对齐 对标 对焦 抓手 拆解 拉通 抽象 摸索 提炼 打通 打透 吃透 迁移 分发 分层...原创 2021-04-02 15:04:48 · 7435 阅读 · 1 评论 -
tomcat默认最大线程数、等待队列长度、连接超时时间
tomcat的默认最大线程数是200,默认核心线程数(最小空闲线程数)是10。在核心线程数满了之后,会直接启用最大线程数(和JDK线程池不一样,JDK线程池先使用工作队列再使用最大线程数),当达到最大线程数后,新的请求会添加到工作队列,工作队列长度是Integer.MAX_VALUE(2147483647)。原创 2021-04-02 10:18:41 · 21956 阅读 · 0 评论 -
notifyAll唤醒线程顺序
notifyAll()方法按照后进先出算法唤醒所有wait状态的线程,即LIFO。执行完唤醒方法,并不会立即唤醒等待线程,在hotspot中是退出同步块的时候才会去真正唤醒对应的线程。notifyAll()唤醒过程还使用了monitorexit,当某个线程从wait状态恢复时,要先获取锁,然后再退出同步块,并唤醒最后一个进入wait状态的线程,依次类推。这些策略都可以通过修改JVM参数来改变。...原创 2021-03-23 23:33:15 · 1575 阅读 · 0 评论 -
Threadlocal
作用用于线程之间数据隔离。使用常见数据库连接、session管理等实现原理set方法public void set(T value) { // 获取当前线程 Thread t = Thread.currentThread(); // 获取ThreadLocalMap对象 ThreadLocalMap map = getMap(t); if (map != null) // 不为空set值 map.set(thi原创 2021-03-21 00:16:04 · 256 阅读 · 0 评论 -
volatile是怎么保证可见性和防止指令重排序的
volatile怎么保证可见性每个线程操作数据的时候会把数据从主内存读取到自己的工作内存,根据MESI思想如果某个线程修改数据写回到主内存,其他线程能通过嗅探检查到本地数据无效,然后重新从主内存读取到自己的工作内存。volatile怎么保证指令重排序通过在指令间加入内存屏障来防止指令重排序。一些概念MESImodified(修改)、exclusive(互斥)、share(共享)、invalid(无效)嗅探总线风暴happens-before...原创 2021-03-18 09:51:06 · 978 阅读 · 1 评论