
java
文章平均质量分 76
java
进朱者赤
阿里非典型程序员一枚:微信公众号同名,记录平平无奇程序员在大厂的打怪升级之路。
Java、大数据、数据结构算法
展开
-
Java 转Scala的那些异同
在这个数据爆炸的时代,大数据应用如雨后春笋般涌现。作为一名 Java 开发者,你可能会发现 Scala 这个新世界充满了诱惑。Scala 结合了面向对象和函数式编程的优点,尤其在大数据领域(如 Apache Spark)中表现得尤为出色。但从 Java 转到 Scala,就像从平坦的公路驶入蜿蜒的山路,既有风景如画的美好,也有让人晕车的挑战。今天,我们就来聊聊这条转型之路上的异同、不适应的地方以及需要注意的事项。原创 2024-12-08 21:40:28 · 1034 阅读 · 0 评论 -
Java工具类RxJava:异步化编程神器
RxJava 是一个使用可观察序列来编写异步和基于事件的程序的库。它扩展了观察者模式,支持数据/事件序列的丰富操作,如映射、过滤、合并等。RxJava 的核心思想是,数据(事件)的序列会在不同的时间点被发出、处理并最终交付给观察者(订阅者)。在使用RxJava之前,你需要将其添加到你的项目中。如果是Maven项目,你可以在pom.xml文件中添加如下依赖:-- 请替换为最新版本号 --> -- 请替换为最新版本号 -->原创 2024-09-19 20:54:42 · 1044 阅读 · 0 评论 -
Java反射为何比直接调用慢?
例如,反射调用通常无法被内联,且由于反射方法的调用是动态的,JIT 编译器无法提前知道要调用的具体方法,从而无法进行诸如方法内联、逃逸分析等优化。因此,在性能要求较高的场景下,应尽量避免过度使用反射,尤其是在性能敏感的代码中。然而,与直接调用相比,反射调用通常伴随着更高的性能损耗。这一过程涉及到对类路径的搜索、类文件的加载、类结构的解析等步骤,相比直接调用方法时直接跳转到目标方法的地址,反射调用显然需要更多的时间和资源。实验结果显示,反射调用的时间通常会比直接调用长很多,这验证了上述的性能损耗原因。原创 2024-09-19 20:42:55 · 683 阅读 · 0 评论 -
JDK 11下“+“字符串拼接与StringBuilder性能之谜
在Java编程中,字符串拼接是一个常见的操作。传统上,我们可能会认为使用进行字符串拼接会比直接使用"+“运算符更高效,因为后者在每次拼接时都会创建新的字符串对象,从而产生额外的性能开销。然而,在JDK 11及后续版本中,这种观念可能需要被重新审视。本文将深入探索在JDK 11下”+"字符串拼接可能比还快的原理,并结合源码解读和原理分析来阐述这一现象。原创 2024-06-12 11:30:35 · 436 阅读 · 0 评论 -
浅谈分布式锁设计
在JVM中,在多线程并发的情况下,我们可以使用同步锁或Lock锁,保证在同一时间内,只能有一个线程修改共享变量或执行代码块。但现在我们的服务基本都是基于分布式集群来实现部署的,对于一些共享资源,例如我们之前讨论过的库存,在分布式环境下使用Java锁的方式就失去作用了。这时,我们就需要实现分布式锁来保证共享资源的原子性。原创 2024-05-21 11:06:21 · 747 阅读 · 0 评论 -
Java性能优化(九)-多线程调优-垃圾回收机制优化
今天的内容比较多,最后再强调几个重点。垃圾收集器的种类很多,我们可以将其分成两种类型,一种是响应速度快,一种是吞吐量高。通常情况下,CMS和G1回收器的响应速度快,Parallel Scavenge回收器的吞吐量高。在JDK1.8环境下,默认使用的是Parallel Scavenge(年轻代)+Serial Old(老年代)垃圾收集器,你可以通过文中介绍的查询JVM的GC默认配置方法进行查看。通常情况,JVM是默认垃圾回收优化的,在没有性能衡量标准的前提下,尽量避免修改GC的一些性能配置参数。原创 2024-05-11 11:26:41 · 845 阅读 · 2 评论 -
Java性能优化(七)-多线程调优-并发容器的使用
跳跃表是基于链表扩展实现的一种特殊链表,类似于树的实现,跳跃表不仅实现了横向链表,还实现了垂直方向的分层索引。一个跳跃表由若干层链表组成,每一层都实现了一个有序链表索引,只有最底层包含了所有数据,每一层由下往上依次通过一个指针指向上层相同值的元素,每层数据依次减少,等到了最顶层就只会保留部分数据了。跳跃表的这种结构,是利用了空间换时间的方法来提高了查询效率。程序总是从最顶层开始查询访问,通过判断元素值来缩小查询范围。我们可以通过以下几张图来了解下跳跃表的具体实现原理。原创 2024-05-09 08:30:00 · 1666 阅读 · 0 评论 -
Java性能优化(六)-多线程调优-乐观锁
LongAdder的原理就是降低操作共享变量的并发数,也就是将对单一共享变量的操作压力分散到多个变量值上,将竞争的每个写线程的value值分散到一个数组中,不同线程会命中到数组的不同槽中,各个线程只对自己槽中的value值进行CAS操作,最后在读取值的时候会将原子操作的共享变量与各个分散在数组的value值相加,返回一个近似准确的数值。LongAdder内部由一个base变量和一个cell[]数组组成。原创 2024-05-08 08:30:00 · 842 阅读 · 0 评论 -
Java性能优化(五)-多线程调优-Lock同步锁的优化
基本特点Lock锁的基本操作通常基于乐观锁实现,尽管在某些情况下(如阻塞时)它也可能采用悲观锁的策略。通过对比图,我们可以清晰地看到两种同步锁的基本特点。Lock同步锁与Synchronized的比较在Java中,同步锁机制是确保多线程安全访问共享资源的重要手段。与JVM隐式管理锁的Synchronized相比,Lock同步锁(以下简称Lock锁)提供了更细粒度的控制,通过显式地获取和释放锁,为开发者提供了更大的灵活性。一、基本特点。原创 2024-05-07 19:30:00 · 734 阅读 · 2 评论 -
Java性能优化(四)-多线程调优-Synchronized优化
JVM在JDK1.6中引入了分级锁机制来优化Synchronized,当一个线程获取锁时,首先对象锁将成为一个偏向锁,这样做是为了优化同一线程重复获取导致的用户态与内核态的切换问题;其次如果有多个线程竞争锁资源,锁将会升级为轻量级锁,它适用于在短时间内持有锁,且分锁有交替切换的场景;轻量级锁还使用了自旋锁来避免线程用户态与内核态的频繁切换,大大地提高了系统性能;但如果锁竞争太激烈了,那么同步锁将会升级为重量级锁。减少锁竞争,是优化Synchronized同步锁的关键。原创 2024-05-06 23:38:14 · 948 阅读 · 0 评论 -
Java性能优化(二):Java基础-String对象及其性能优化
在深入探讨了String字符串的性能优化后,我们认识到优化字符串处理对提升系统整体性能的重要性。Java在版本迭代中,通过精心调整成员变量和内存管理机制,不断对String对象进行优化,以更高效地使用内存资源。String对象的不可变性是Java语言设计中的一个关键特性,它不仅确保了字符串的安全性,也为字符串常量池的实现提供了基础。通过减少相同值的字符串对象的重复创建,常量池有效地节约了内存空间。然而,不可变性也带来了挑战。在处理长字符串拼接时,我们需要显式使用类来避免性能下降。原创 2024-05-04 16:30:47 · 1467 阅读 · 0 评论 -
深入Java中间件:编程设计精粹
阿里非典型程序员一枚 ,记录平平无奇程序员在大厂的打怪升级之路。一起学习Java、大数据、数据结构算法(原创 2024-04-16 15:47:23 · 1196 阅读 · 9 评论 -
Java8中JUC包同步工具类深度解析(Semaphore,CountDownLatch,CyclicBarrier,Phaser)
工具类主要用途内部原理使用场景Semaphore控制访问某个或多个共享资源的线程数量基于AQS实现,维护一个许可计数器需要限制并发访问共享资源的场景,如连接池、线程池等允许一个或多个线程等待其他线程完成操作基于AQS实现,维护一个计数器用于协调一组线程的执行顺序,例如启动多个线程并行处理任务,并在所有任务完成后执行汇总操作让一组线程互相等待,直到所有线程都到达某个公共屏障点使用锁和条件变量实现,维护屏障的周期和计数器。转载 2024-04-15 11:49:45 · 1483 阅读 · 11 评论 -
Java不同版本的多线程开发:进化之路
从Java的版本发展来看,多线程编程在Java中得到了不断的改进和增强。每个新版本都引入了新的工具和API,使得并发编程变得更加高效、灵活和易于使用。随着技术的不断发展,我们可以期待Java在未来继续为多线程开发带来更多的创新和突破。!!代码改变世界。原创 2024-04-14 13:58:48 · 917 阅读 · 13 评论 -
你真是了解Java数组吗?
通过本文的介绍,读者应该对Java数组的定义、使用、底层存储原理以及与其他数据类型的转换有了更深入的了解。数组是Java中非常重要的数据结构之一,它允许我们存储相同类型的数据元素的集合,并可以通过索引来访问这些元素。需要确保数组中的对象类型是可序列化的,否则在执行序列化的过程中可能会抛出异常。数组的长度是固定的,而集合框架的长度是可变的。Java的数组是固定长度的,一旦分配了内存空间,其长度在运行时是不可改变的。通过索引可以直接访问数组中的元素。三维数组是数组的数组的数组,即每个元素都是一个二维数组。原创 2024-04-10 23:39:48 · 909 阅读 · 2 评论 -
Spring用到了哪些设计模式?
本文旨在深入剖析Spring框架中运用的主要设计模式,并通过代码示例来论证这些设计模式的实际应用原创 2024-04-10 08:43:25 · 1101 阅读 · 1 评论 -
Spring常见面试题(含答案)
Spring的核心容器是指Spring容器,它负责初始化、配置和管理Bean对象。Spring容器有两种类型:BeanFactory和ApplicationContext。BeanFactory是基础容器接口,提供了基本的Bean管理功能;ApplicationContext是BeanFactory的子接口,增加了更多的高级功能,如国际化处理、事件发布等。Spring的声明式事务是通过AOP实现的,它允许开发者通过配置方式来定义事务的边界。原创 2019-08-19 11:30:18 · 2687 阅读 · 1 评论 -
IP工具类
类提供了一些基本的IP地址处理功能,但是如果你需要更复杂的操作,比如IP地址范围检查、CIDR表示法处理等,那么使用第三方库可能更加方便。在Java中,处理IP地址的工具类可以通过使用Java的内置库或者第三方库来实现。原创 2021-06-18 11:01:23 · 499 阅读 · 0 评论 -
SpringBoot自动装配原理
配合@EnableAutoConfiguration注解使用时,它主要扮演的是配置查找器的角色。这个注解利用其自身的完整类名org.springframework.boot.autoconfigure.EnableAutoConfiguration作为搜索的关键词(Key),来定位并加载一组相关的@Configuration类。SpringBoot的自动装配主要依赖于Spring框架的条件配置(Conditional Configuration)和Java的配置类(Java Config)功能。原创 2024-04-05 10:01:14 · 1823 阅读 · 2 评论 -
集合框架里List、Set、Map中添加元素(add,put)方法返回值问题
基本返回值都是true(因为通过源码我们可以看到它通过是否修改原有集合来返回true或者false,而多数情况下,List内容可以重复,所以相当于它的内容始终在改变,所以返回为true)在Map中添加元素使用put方法,在返回值问题上,因为Map中是以键值对存在,因此当一个键值是第一次被添加时返回值为null,否则返回为上一次添加的value。因为Set分支的特点是无序且不可重复,因此通过add方法添加相同的值时,第一次返回为true,后面再加相同元素的话就会返回false,因为元素重复。原创 2019-06-19 20:52:27 · 3310 阅读 · 1 评论 -
ArrayList和LinkedList
ArrayList和LinkedList都是Java集合框架中的列表实现,但它们在底层数据结构、性能特点和适用场景方面有所不同。原创 2019-05-08 09:31:54 · 209 阅读 · 1 评论 -
Java技术之AQS详解(AbstractQueuedSynchronizer)
但共享模式下,多个线程是可以同时执行的,现在因为老二的资源需求量大,而把后面量小的老三和老四也都卡住了。正常来说,tryRelease()都会成功的,因为这是独占模式,该线程来释放资源,那么它肯定已经拿到独占资源了,直接减掉相应量的资源即可(state-=arg),也不需要考虑线程安全的问题。跟独占模式下的release()相似,但有一点稍微需要注意:独占模式下的tryRelease()在完全释放掉资源(state=0)后,才会返回true去唤醒其他线程,这主要是基于独占下可重入的考量;原创 2019-09-04 00:26:17 · 212 阅读 · 1 评论 -
进程&线程以及通信方式
总结: 进程是程序的执行实例,有独立的内存空间和资源,通过进程间通信进行通信,调度开销相对较大。而线程是进程内的执行单位,共享进程的资源,通信方式主要是共享内存,调度开销相对较小。进程可以看作是线程的容器,一个进程可以包含多个线程,线程之间相对轻量级,可以提高系统的并发性和资源利用率。管道(Pipe):管道是一种半双工的通信方式,可以在具有亲缘关系的进程之间传递数据。共享内存(Shared Memory):线程共享相同的进程内存空间,它们可以直接访问和修改共享内存中的数据,实现线程间的数据共享。原创 2019-08-14 11:24:13 · 378 阅读 · 1 评论 -
golang和java对比
以上只是Go和Java在一些关键方面的技术比较。具体选择哪个编程语言还取决于项目需求、团队技术栈和个人偏好等因素。原创 2024-04-02 09:30:00 · 584 阅读 · 0 评论 -
重入锁及实现原理
在一个类中,如果synchronized方法1调用了synchronized方法2,方法2是可以正常执行的,这说明synchronized是可重入锁。否则,在执行方法2想获取锁的时候,该锁已经在执行方法1时获取了,那么方法2将永远得不到执行。释放锁时,需要给锁的获取次数减1,然后判断,次数是否为0了。如果次数为0了,则需要调用锁的唤醒方法,让锁上阻塞的其他线程得到执行的机会。可重入锁,也叫做递归锁,指的是同一线程外层函数获得锁之后,内层递归函数仍然有获取该锁的代码,但不受影响。原创 2019-09-01 12:41:30 · 3179 阅读 · 1 评论 -
Servlet中的service()方法
而对于service方法,一般来说这个方法是不需要重写的,因为在HttpServlet中已经有了很好的实现,它会根据请求的方法名(GET,POST),调用doGet,doPos以及其他的doXXX方法,也就是说service是用来转向的,所以我们一般写一个servlet,只需要重写doGet或者doPost就可以了。Servlet的生存时间是由init,service,destory方法构成,这里分析一下service这个方法。原创 2019-09-01 22:42:57 · 2554 阅读 · 1 评论 -
ThreadLocal和Synchonized
ThreadLocal 和 synchronized 是 Java 中用于实现线程安全的两种机制,它们之间有以下几点区别原创 2019-09-04 00:20:57 · 171 阅读 · 1 评论 -
@interface使用详解
@interface不是接口是注解类,在jdk1.5之后加入的功能,使用@interface自定义注解时,自动继承了java.lang.annotation.Annotation(annotation 英[ˌænəˈteɪʃn] 美[ˌænəˈteɪʃn] )接口,由编译程序自动完成其他细节,我们通过反编译可以看到,源代码如下://保留的环境@Retention(RUNTI...原创 2019-07-23 14:21:54 · 2792 阅读 · 0 评论 -
【建议一次性看完】Spring IOC 容器源码分析
Spring 最重要的概念是 IOC 和 AOP,本篇文章其实就是要带领大家来分析下 Spring 的 IOC 容器。既然大家平时都要用到 Spring,怎么可以不好好了解 Spring 呢?阅读本文并不能让你成为 Spring 专家,不过一定有助于大家理解 Spring 的很多概念,帮助大家排查应用中和 Spring 相关的一些问题。本文采用的源码版本是 4.3.11.RELEASE,算是 5.0.x 前比较新的版本了。为了降低难度,本文所说的所有的内容都是基于 xml 的配置的方式,实际使用已经很少原创 2021-04-27 21:15:19 · 494 阅读 · 0 评论 -
Java技术总结+资源分享
一些学习网站和资源汇总原创 2020-01-02 21:23:34 · 1117 阅读 · 0 评论 -
【经典算法】LeetCode 1143:最长公共子序列Java/C/Python3实现含注释说明,Medium)
解法时间复杂度空间复杂度备注动态规划O(m * n)O(m * n)使用二维数组保存中间计算结果递归优化O(m * n)O(m * n)使用二维数组保存中间计算结果。原创 2024-03-28 17:47:11 · 630 阅读 · 0 评论 -
Java开发中如何更高效?
工具类 / 所属库常用方法描述使用示例isEmpty()检查字符串是否为空或null检查字符串是否非空且非nulljoin()连接数组元素为字符串reverse()反转字符串获取两个字符串之间的子串将文件内容读取为字符串将字符串写入文件copyFile()复制文件安静地删除文件,不抛异常计算目录大小生成随机字母字符串生成随机数字字符串生成随机字母数字混合字符串检查字符串是否能转换为数字toInt()将字符串转换为int型数字toDouble()原创 2023-11-22 10:51:54 · 272 阅读 · 0 评论 -
Java技术之AQS详解(AbstractQueuedSynchronizer)
但共享模式下,多个线程是可以同时执行的,现在因为老二的资源需求量大,而把后面量小的老三和老四也都卡住了。正常来说,tryRelease()都会成功的,因为这是独占模式,该线程来释放资源,那么它肯定已经拿到独占资源了,直接减掉相应量的资源即可(state-=arg),也不需要考虑线程安全的问题。跟独占模式下的release()相似,但有一点稍微需要注意:独占模式下的tryRelease()在完全释放掉资源(state=0)后,才会返回true去唤醒其他线程,这主要是基于独占下可重入的考量;原创 2019-09-01 12:35:55 · 6053 阅读 · 1 评论 -
单例模式推荐的三种实现方式
//6.双重检查(推荐使用)public class Singleton{ private Singleton(){} private static volatile Singleton singleton; public static Singleton getInstance(){ if(singleton == null){ ...原创 2019-10-22 14:54:28 · 270 阅读 · 0 评论 -
cron表达式
cron: CronTriggers克朗触发器原创 2022-03-24 00:47:11 · 248 阅读 · 1 评论 -
面试神器:java进阶手册
JAVA面试学习资料/进阶学习《JAVA进阶手册》,压轴技能全攻略,面试高手带你嗨翻天。原创 2021-12-17 00:02:36 · 1041 阅读 · 1 评论 -
synchronized的三种应用方式
synchronized的三种应用方式修饰实例方法,作用于当前实例加锁,进入同步代码前要获得当前实例的锁 静态方法,作用于当前类对象加锁,进入同步代码前要获得当前类对象的锁 修饰代码块,指定加锁对象,对给定对象加锁,进入同步代码库前要获得给定对象的锁。锁的四个状态锁的状态总共有四种,级别由低到高依次为:无锁、偏向锁、轻量级锁、重量级锁,这四种锁状态分别代表什么,为什么会有锁升级?其实在 JDK 1.6之前,synchronized 还是一个重量级锁,是一个效率比较低下的锁,但是在JDK原创 2021-08-05 22:45:24 · 515 阅读 · 0 评论 -
Java对象锁的分类
|;原创 2021-07-09 18:51:53 · 207 阅读 · 0 评论 -
logback.xml
<?xml version="1.0" encoding="UTF-8"?><configuration> <!-- 定义日志文件的存储地址 --> <!-- 关于catalina.base解释如下: catalina.home指向公用信息的位置,就是bin和lib的父目录。 catalina.base指向每个Tomcat目录私有信息的位置,就是conf、logs、temp、webapps和work的父目录。 --> <pr.原创 2021-06-21 15:56:04 · 228 阅读 · 0 评论 -
公平锁与非公平锁
根据线程获取锁的抢占机制,锁可分为公平锁和非公平锁。公平锁:线程获取锁的顺序是按照线程请求锁的时间顺序决定的,也就是最早请求的线程将最早获取到锁,即 FIFO 可用 JUC 中的lock提供了实现 ReentrantLock lock=new ReentrantLock (ture) 非公平锁:线程加锁时直接尝试获取锁,获取不到才排到队尾等待,不一定FIFO。代表:synchron...原创 2019-09-05 16:53:24 · 241 阅读 · 0 评论