
Java SE高级
文章平均质量分 80
Java SE高级
Apple_Web
吃苹果的程序员正在努力ing...
展开
-
深入剖析Java线程池的核心概念与源码解析:从Executors、Executor、execute逐一揭秘
在日常编码中,特别是在处理并发编程时,Java 提供了很多便捷工具帮助我们高效运行。不过你是否也曾被 Executors、Executor 和 execute 这些名字搞得一头雾水?它们长得这么像,究竟有什么区别呢?接下来跟着我一探究竟吧!比较项线程状态线程池状态描述单个线程在其生命周期中所处的状态。线程池在其生命周期中所处的状态。常见状态NEWRUNNABLEBLOCKEDWAITINGTERMINATEDRUNNINGSHUTDOWNSTOPTIDYINGTERMINATED主要用途。原创 2024-06-01 21:36:47 · 1729 阅读 · 0 评论 -
从用法到源码再到应用场景:全方位了解CompletableFuture及其线程池
JDK中的Future是什么可能大家都知道了,那呢?从英文看单词猜测应该也是和Future是Java 8引入的一个重要特性,它是Future接口的一个实现,但与传统的Future相比,提供了更强大、灵活的异步编程模型。支持非阻塞的链式调用、组合多个异步操作以及更优雅地处理异步计算的结果或异常。它允许你在异步操作完成时执行回调函数,且这些操作可以并行或串行执行,极大地提高了程序的并发能力和响应速度。使用// 创建一个完成的CompletableFuture// 运行异步计算// 异步执行的代码。原创 2024-05-26 18:56:53 · 3630 阅读 · 0 评论 -
定时任务场景下的代码审查:continue和return的滥用可能引发潜在bug
在最近的代码审查中,有帮忙审查了组里一个刚毕业1年不到的应届生,发现他写的其中一段代码将for循环中的break、continue、return滥用,导致了一个潜在的bug风险,这个风险后文我们再来分析。continue关键字的作用是跳过当前的迭代,继续执行下一次的迭代。它可以用来跳过某些不需要执行的情况,或者优化循环的效率。break关键字的作用是结束当前的循环,跳出循环体。它可以用来提前终止循环,或者跳出嵌套的循环。return关键字的作用是结束当前的方法,并返回一个值(如果有的话)。原创 2023-11-04 17:22:17 · 380 阅读 · 0 评论 -
面试官:听说你很了解Java8特性,给我优化一下这段代码吧?
在之前的一次面试过程中,我被问到了一道代码优化题:对于下面的代码,你有什么优化的思路呢?原创 2023-10-24 21:12:19 · 249 阅读 · 0 评论 -
一文带你扫盲日志记录的基础知识
文章目录一、日志记录入门二、日志记录域三、日志记录安全使用场景四、 设计、实现和测试注意事项五、 要记录的事件六、事件属性七、使用 OWASP 进行安全日志记录监控应用程序基础结构的健康状况日志消息关联您在启动应用时是否记录足够多的信息?八、日志记录技术一、日志记录入门读者可能会想知道:为什么要介绍日志记录?我们多年来一直在进行日志记录。还有什么需要知道的吗?在忙着部署产品的过程中,日志记录几乎总是被忽视。这并不是因为日志记录不重要,而是因为它被认为是产品团队对其产品需求没有特别要求的非功能性使用场景原创 2021-12-15 14:49:21 · 5044 阅读 · 0 评论 -
Java中的Pair完美解决了我的一个BUG。。。
文章目录概念基本使用实际业务使用(Bug解决)在最近的工作中有一个Bug的解决用到了Pair,之前还没用过Pair这个类,只是见过,这次顺便记录学习一下概念配对(Pair):它提供了一种方便方式来处理简单的键值关联,有两种场景可以使用:第一种使用场景比较简单,我这里主要讲下第二种,我的Bug解决也是说的第二种1、当我们想从方法返回两个值时特别有用2、当我们使用单个字段无法识别某个对象的唯一性,还需要加上一个字段辅助识别的情况下就可以使用Pair(下面会讲)基本使用这里我Pair使用的是c原创 2021-09-01 19:16:08 · 885 阅读 · 1 评论 -
一文搞懂标识接口/空接口和标记注解
基本概念标识接口是没有任何方法和属性的接口。标识接口不对实现它的类有任何语义上的要求,它仅仅表明实现它的类属于一个特定的类型。标识接口在Java语言中有一些很著名的应用,例如我们常用的ArrayList类,它的类实现接口如下:public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializabl原创 2021-05-20 15:59:09 · 1481 阅读 · 0 评论 -
美团大佬带你了解Java中的各种“锁“事
文章目录前言1. 乐观锁 VS 悲观锁2. 自旋锁 VS 适应性自旋锁3. 无锁 VS 偏向锁 VS 轻量级锁 VS 重量级锁Java对象头Monitor4. 公平锁 VS 非公平锁5. 可重入锁 VS 非可重入锁6. 独享锁 VS 共享锁结语参考资料前言Java提供了种类丰富的锁,每种锁因其特性的不同,在适当的场景下能够展现出非常高的效率。本文旨在对锁相关源码(本文中的源码来自JDK 8和Netty 3.10.6)、使用场景进行举例,为读者介绍主流锁的知识点,以及不同的锁的适用场景。Java中往往是转载 2021-02-25 10:52:43 · 405 阅读 · 0 评论 -
一文带你搞懂JMM内存模型和JVM内存区域
文章目录理解Java内存区域与Java内存模型Java内存区域Java内存模型概述硬件内存架构与Java内存模型硬件内存架构Java线程与硬件处理器Java内存模型与硬件内存架构的关系JMM存在的必要性Java内存模型的承诺原子性理解指令重排编译器重排处理器指令重排可见性有序性JMM提供的解决方案理解JMM中的happens-before 原则volatile内存语义volatile的可见性volatile禁止重排优化理解Java内存区域与Java内存模型Java内存区域Java虚拟机在运行程序时会转载 2021-02-21 15:27:16 · 1196 阅读 · 0 评论 -
Java创建线程池的两种方式及多线程并发测试
文章目录Java创建线程的三种方式线程池的优点Java中创建线程池的两种方式Executors工厂方法创建new ThreadPoolExecutor()自定义创建corePoolSize和maximumPoolSizeworkQueue任务队列拒绝策略Java创建线程的三种方式继承Thread类创建线程类实现Runnable接口通过Callable和Future创建线程线程池的优点重用存在的线程,减少对象创建、消亡的开销,性能佳可有效控制最大并发线程数,提高系统资源的使用率,同时避原创 2020-10-25 13:39:52 · 2617 阅读 · 0 评论 -
JDK1.7 HashMap源码解析+常见问题
文章目录基础JDK1.7变量说明构造函数putresizegetremovereplace???常见问题1、为什么容量要2的次幂2、为什么是最大容量是2的30,而不是2的313、为什么要用红黑树而不是其他的树?既然红黑树那么好,为啥hashmap不直接采用红黑树,而是当大于8个的时候才转换红黑树?JDK1.7和1.8相关问题JDK1.7和1.8中HashMap为什么是线程不安全的?前言扩容引发的线程不安全扩容造成死循环和数据丢失的分析过程JDK1.8中的线程不安全总结JDK1.7和1.8区别总结原因:第1、原创 2020-10-24 14:27:28 · 4596 阅读 · 0 评论 -
一文搞懂java.util.ConcurrentModificationException异常原因和解决方法
文章目录场景复现原因分析解决方法ListMap场景复现对于list,map都有可能出现,这里主要分析list! @Test public void testList() { List<String> list = new ArrayList(); list.add("1"); list.add("2"); list.add("3"); list.add("4"); list.add原创 2020-08-13 15:52:50 · 8740 阅读 · 1 评论 -
强化基础,HashMap源码全角度详细解析
文章目录一、重新认识HashMap二、知其所以然----撸源码1. 从类注释开始,能够掌握整个HashMap大致框架2. 初始化2.1、构造方法解析2.2、负载因子、阈值深度解析3. 新增3.1、新增源码分析:3.2、扩容3.3、链表树化3.4、红黑树拆分、链化4. 删除5. 查找6. 遍历三、总结一、重新认识HashMap什么是HashMap?HashMap底层基于散列(Hash)算法,采用hash表实现键值对集合,继承了AbstractMap,实现了Map接口。最早出现在jdk1.2,允许nu转载 2020-05-27 23:23:49 · 388 阅读 · 0 评论 -
一文搞定Java并发面试
文章目录1、Object的wait()和notify() 方法2、并发特性 - 原子性、有序性、可见性3、synchronized 实现原理?4、volatile 的实现原理?5、Java 内存模型(JMM)6、有关队列 AQS 队列同步器7、锁的特性8、ReentrantLock 锁9、ReentrantReadWriteLock10、Synchronized 和 Lock 的区别11、Java 中线程同步的方式12、CAS 是一种什么样的同步机制?多线程下为什么不使用 int 而使用 AtomicInt转载 2020-05-08 17:33:56 · 398 阅读 · 0 评论 -
Java中Compareable和Comparator的区别
一、对比简介实现compareable接口与Comparator接口的类,都是为了对象实例数组排序的方便,因为可以直接调用java.util.Arrays.sort(对象数组名称),可以自定义排序规则。排序实现的原理都是基于红黑二叉树原理实现的。Comparable是排序接口。若一个类实现了Comparable接口,就意味着该类支持排序。实现了Comparable接口的类的对象的列表或数组...原创 2019-11-06 10:37:05 · 1742 阅读 · 0 评论 -
深入理解Arrays.asList
文章目录1 错误用法2 深入探究3 不同之处4 揭晓答案5 支持基础类型的方式6 数组转ArrayList使用Arrays.asList()的原因无非是想将数组或一些元素转为集合,而你得到的集合并不一定是你想要的那个集合。而一开始asList的设计时用于打印数组而设计的,但jdk1.5开始,有了另一个比较更方便的打印函数Arrays.toString(),于是打印不再使用asList...转载 2020-01-16 09:53:20 · 761 阅读 · 0 评论 -
总结Java8那些事
文章目录Java8总结1 Lambda表达式2 强大的 Stream API什么是 StreamStream的操作三步骤创建Stream中间操作终止操作3 并行流与串行流4 Optional类5 接口中的默认方法与静态方法6 重复注解与类型注解新时间日期APIJava8 Stream排序Java8 时间计算1.Period类2.Duration3.ChronoUnit类4.until()Java8...原创 2020-01-14 21:59:52 · 3632 阅读 · 0 评论 -
你不知道的Java探针?
文章目录基于JavaAgent和Java字节码注入技术的java探针工具技术原理一个简单的JavaAgent demo实例常见问题一、什么是java agent?二、java agent可以实现什么样的功能?三、java agent的实现原理?3.1、JVMTI3.2、JVMTIAgent3.3、instrument agent3.4、JVM Attach机制3.5、Class Transform...原创 2020-01-14 16:57:30 · 2183 阅读 · 0 评论 -
一个Java对象和Hashmap对象占用多大内存
文章目录一个Java对象占用多少字节?1、JAVA 对象布局1.1对象头(Header):1.2实例数据(Instance Data)1.3对齐填充(Padding)2、Java数据类型有哪些2.1基础数据类型内存占用如下2.2引用类型 内存占用如下:2.3字段重排序3、验证3.1有一个Fruit类继承了Object类,我们分别新建一个object和fruit,那他们分别占用多大的内存呢?3.2 ...原创 2019-12-03 21:47:35 · 17337 阅读 · 4 评论 -
Java中的可重入锁和不可重入锁
锁的简单应用用lock来保证原子性(this.count++这段代码称为临界区)什么是原子性,就是不可分,从头执行到尾,不能被其他线程同时执行。可通过CAS来实现原子操作CAS(Compare and Swap):CAS操作需要输入两个数值,一个旧值(期望操作前的值)和一个新值,在操作期间先比较下旧值有没有发生变化,如果没有发生变化,才交换成新值,发生了变化则不交换。CAS主要通过c...原创 2019-12-02 10:20:27 · 2127 阅读 · 0 评论 -
Java的原子操作及存在的三个问题
什么是原子操作http://www.infoq.com/cn/articles/atomic-operations-and-contention计算机操作最重要的构成单位是原子操作。这里的原子跟物理上说的原子没有任何关系,而是起源于单词atom,也就是希腊语“ἄτομος”(意为不可见的)。原子操作是一种不可再细分的操作,或者在系统中其他处理器看来是不可再分了。为了说明为什么原子操作很重要,考...转载 2019-12-02 10:02:50 · 525 阅读 · 0 评论 -
Java中13个原子操作类总结
原子更新方式原子更新基本类型原子更新数组原子更新引用原子更新属性(字段)原子更新基本类型AtomicBoolean :原子更新布尔类型AtomicInteger: 原子更新整型AtomicLong: 原子更新长整型原子更新数组AtomicIntegerArray :原子更新整型数组里的元素AtomicLongArray :原子更新长整型数组里的元素At...转载 2019-12-02 09:40:04 · 300 阅读 · 0 评论 -
一文详解Java中的拆箱和装箱操作
一、什么是自动装箱和拆箱:我们知道java为8种基本类型分别提供了对应的包装类型,在Java SE5之前,如果要生成一个数值为10的Integer对象,必须这样进行:Integer i=new Integer(10);而在从Java SE5开始就提供了自动装箱的特性,如果要生成一个数值为10的Integer对象,只需要这样就可以了:Integer i=10;这个过程会自动根据数值的类...原创 2019-11-08 11:08:47 · 2304 阅读 · 1 评论 -
一文详解Java注解
文章目录注解的好处一、Java中的常见注解二、注解的分类三、自定义注解准备工作其他RetentionPolicy类型如何自定义注解特殊语法注解保持力的三个阶段:说明注解的好处1.能够读懂别人写的代码,特别是框架相关的代码。2.本来可能需要很多配置文件,需要很多逻辑才能实现的内容,就可以使用一个或者多个注解来替代,这样就使得编程更加简洁,代码更加清晰。3.(重点)刮目相看。(但是怎么样才能...原创 2019-10-24 14:42:53 · 589 阅读 · 0 评论 -
一篇文章了解Java反射和应用
什么是反射反射就是指程序在运行的时候可以知道一个类的自身信息。对于任何一个类:可以知道这个类的属性和方法。对于任何一个对象:可以调用这个对象的任何一个方法和属性。反射就是把java类中的各种成分映射成一个个的Java对象例如:一个类有:成员变量、方法、构造方法、包等等信息,利用反射技术可以对一个类进行 解剖,把个个 组成部分映射成一个个对象。(其实:一个类中这些成员方法、构造方法、在加...转载 2019-10-24 09:29:50 · 268 阅读 · 0 评论 -
源码分析数组和集合之间的转换
文章目录数组转换为集合引语:问题分析:总结:集合转换为数组数组转换为集合引语:阿里巴巴java开发规范说到使用工具类Arrays.asList()方法把数组转换成集合时,不能使用其修改集合相关的方法,它的add/remove/clear方法会抛出UnsupportedOperationException(),我们来看一下为什么会出现这种情况。问题分析:我们做个测试public stat...原创 2019-09-15 11:54:51 · 244 阅读 · 0 评论 -
泛型T和?的区别
泛型的使用有效的降低了代码的冗余,减少了重复无用的代码,使代码的可读性更高,更简洁,同时也缩短了搬 砖工人的重复劳动时间。种类: T:表示确定的类型,最常用的泛型表示方法。 ? :表示不确定的类型,类似于通配符。 K:一般用于键值对中的 –>键 v:一般用于键值对中的 –>值 E:表示枚举。范围: T:表示同一种类型。 ?:表示任意类型。写法:...原创 2019-09-08 00:56:34 · 6098 阅读 · 0 评论 -
序列化知识点总结
文章目录1.应用场景2.如何声明一个可序列化的类?3.serialVersionUID4.transient 与 static、transient 与 final5.序列化机制6.定制序列化规则1.应用场景2.如何声明一个可序列化的类?一个类可序列化的前提:实现Serializable接口一个属性不想序列化的方式:增加transient关键字3.serialVersionUIDs...原创 2019-09-08 00:30:05 · 1086 阅读 · 0 评论 -
案例深入分析多线程的两种实现方式
文章目录一、创建多线程的两种方式二、隐藏的问题一、创建多线程的两种方式Java中,有两种方式可以创建多线程:1 通过继承Thread类,重写Thread的run()方法,将线程运行的逻辑放在其中2 通过实现Runnable接口,实例化Thread类在实际应用中,我们经常用到多线程,如车站的售票系统,车站的各个售票口相当于各个线程。当我们做这个系统的时候可能会想到两种方式来实现,继承Thr...转载 2019-09-07 19:19:13 · 1377 阅读 · 0 评论 -
多线程知识点总结
文章目录进程和线程线程的状态及生命周期多线程实现的两种方式终止线程线程的优先级线程同步死锁yield与join方法的区别进程和线程进程: 程序在执行过程中分配和管理资源的基本单位,是一个动态概念,竞争计算机系统资源的基本单位。线程: 是进程的一个执行单元,是进程内部的调度实体;比进程更小的独立运行的基本单位;线程也被称为轻量级进程 。一个进程可以包含一个或多个线程,一个线程就是一个程序内部...原创 2019-09-07 19:17:08 · 1689 阅读 · 0 评论