
JAVA
文章平均质量分 71
JAVA
Winn~
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
两个线程交替打印1-100
摘要:本文提供了两种Java多线程交替打印奇偶数的解决方案:1) 使用ReentrantLock配合Condition条件变量实现线程间精确通知;2) 采用synchronized同步块结合wait/notify机制实现。两种方案都通过互斥锁保证线程安全,并使用等待/通知机制实现奇偶线程的有序交替执行,核心区别在于锁的实现方式不同。代码示例展示了完整的实现逻辑,包括线程创建、锁获取与释放以及条件判断处理。原创 2025-05-27 12:05:06 · 197 阅读 · 0 评论 -
Java多线程之线程控制
如果我们需要让当前正在执行的线程暂停一段时间,并进入阻塞状态,则可以通过调用Thread的sleep方法注意如下几点问题①、sleep是静态方法,最好不要用Thread的实例对象调用它,因为它睡眠的始终是当前正在运行的线程,而不是调用它的线程对象,它只对正在运行状态的线程对象有效。原创 2025-04-28 15:28:56 · 912 阅读 · 0 评论 -
Error和Exception的区别
运行时异常(RuntimeException)比如,程序中除数为0引起的错误、数组下标越界错误等,这类异常也称为运行时异常,因为它们虽然是由程序本身引起的异常,但不是程序主动抛出的,而是在程序运行中产生的。运行时异常;ArithmaticException,IllegalArgumentException,编译能通过,但是一运行就终止了,程序不会处理运行时异常,出现这类异常,程序会终止。受检查的异常。原创 2025-04-28 14:50:22 · 199 阅读 · 0 评论 -
Java语法糖写法
2、遍历list,获取每一个对象的name属性,转化为list返回。1、如果model不为空,获取他的data属性,否则返回null。原创 2024-06-19 15:57:43 · 678 阅读 · 0 评论 -
什么是JMM以及 Volatile
Java内存模型,不存在的东西,概念!约定!原创 2024-04-24 12:15:46 · 327 阅读 · 0 评论 -
函数式接口及Stream流式计算
ForkJoin 特点:工作窃取,这个里面维护的都是双端队列。原创 2024-04-24 12:02:00 · 556 阅读 · 0 评论 -
并发JUC经典提问
CAS : 比较当前工作内存中的值和主内存中的值,如果这个值是期望的,那么则执行操作!如果不是就一直循环!缺点:1、 循环会耗时2、一次性只能保证一个共享变量的原子性3、ABA问题捣乱的线程把2020改成2021又改成2020,期望的线程并不知道中间变过。原创 2024-04-24 11:14:17 · 321 阅读 · 0 评论 -
Arthas 使用方法简介
Arthas是阿里开源的一款 Java 诊断工具,可以在无需重启 JVM 的情况下,实时查看应用 load、内存、gc、线程等状态信息,还能实时查看方法调用入参、出参、方法调用耗时等。原创 2023-08-15 15:05:42 · 306 阅读 · 0 评论 -
每天100w次登陆请求, 8G 内存该如何设置JVM参数?
对象进入老年代的动态年龄判断规则 (动态晋升年龄计算阈值):Minor GC 时,Survivor 中年龄 1 到 N 的对象大小超过 Survivor 的 50% 时,则将大于等于年龄 N 的对象放入老年代。核心的优化策略是:是让短期存活的对象尽量都留在survivor里,不要进入老年代,这样在minor gc的时候这些对象都会被回收,不会进到老年代从而导致full gc。原创 2023-07-28 15:21:27 · 310 阅读 · 0 评论 -
五大限流设计方式
计数器是一种最简单限流算法,其原理就是:在一段时间间隔内,对请求进行计数,与阀值进行比较判断是否需要限流,一旦到了时间临界点,将计数器清零。这个就像你去坐车一样,车厢规定了多少个位置,满了就不让上车了,不然就是超载了。原创 2023-07-17 14:27:28 · 308 阅读 · 0 评论 -
三分钟了解 SpringBoot 的启动流程
背景:最近有位开发同学说面试被问到Spring Boot 的启动流程,以及被问到Spring Boot 的嵌入式Web容器是什么时候加载的。如何加载的。是怎么无缝切换的。这些问题,其实回答起来也是比较复杂的。我们今天就从 SpringApplication.run(EasyPaasAdminApplication.class, args);入口,逐渐向下看下执行流程。来试着回答一下前面这两个问题。原创 2023-07-11 10:57:24 · 402 阅读 · 0 评论 -
订单自动取消的11种实现方式(上)
DelayQueue是JDK提供的api,是一个延迟队列DelayQueue泛型参数得实现Delayed接口,Delayed继承了Comparable接口。getDelay方法返回这个任务还剩多久时间可以执行,小于0的时候说明可以这个延迟任务到了执行的时间了。compareTo这个是对任务排序的,保证最先到延迟时间的任务排到队列的头。原创 2023-07-07 12:06:41 · 314 阅读 · 0 评论 -
Spring Boot + Disruptor = 王炸!
Disruptor是英国外汇交易公司LMAX开发的一个高性能队列,研发的初衷是解决内存队列的延迟问题(在性能测试中发现竟然与I/O操作处于同样的数量级)。基于Disruptor 开发的系统单线程能支撑每秒 600 万订单,2010 年在 QCon 演讲后,获得了业界关注。Disruptor是一个开源的Java框架,它被设计用于在生产者—消费者(producer-consumer problem,简称PCP)问题上获得尽量高的吞吐量(TPS)和尽量低的延迟。原创 2023-07-04 10:56:41 · 175 阅读 · 0 评论 -
json字符串转复杂嵌套map
【代码】json字符串转复杂嵌套map。原创 2023-06-07 18:11:23 · 687 阅读 · 0 评论 -
CompletableFuture真香,可以替代CountDownLatch!
之前我们提到了 Future 和 Promise。Future 相当于一个占位符,代表一个操作将来的结果。一般通过 get 可以直接阻塞得到结果,或者让它异步执行然后通过 callback 回调结果。但如果回调中嵌入了回调呢?如果层次很深,就是回调地狱。Java 中的 CompletableFuture 其实就是 Promise,用来解决回调地狱问题。Promise 是为了让代码变得优美而存在的。原创 2023-06-06 11:43:00 · 511 阅读 · 0 评论 -
Java 的 8 种异步实现方式,让性能炸裂起来
*** 线程池参数配置,多个线程池实现线程池隔离,@Async注解,默认使用系统自定义线程池,可在项目中设置多个线程池,在异步调用的时候,指明需要调用的线程池名称,比如:@Async("taskName")/*** 自定义线程池//返回可用处理器的Java虚拟机的数量 12 int i = Runtime . getRuntime() . availableProcessors();System . out . println("系统最大线程数 : " + i);原创 2023-06-06 10:41:09 · 570 阅读 · 0 评论 -
聊透Spring事件机制
事件机制是Spring为企业级开发提供的神兵利器之一,它提供了一种低耦合、无侵入的解决方式。但其实Spring事件的设计其实并不复杂,它由三部分组成:事件、发布器、监听器。事件是主体,发布器负责发布事件,监听器负责处理事件。2.1定义自定义事件// 事件需要继承ApplicationEvent public class MyApplicationEvent extends ApplicationEvent {super(id);return id;} }2.2 发布自定义事件。原创 2023-01-09 18:08:15 · 870 阅读 · 0 评论 -
Java 8 Stream 之 collect() 的奇技淫巧
我今天想分享的是 收集 这part的玩法。原创 2022-12-27 10:37:37 · 148 阅读 · 0 评论 -
构建高性能内存队列:Disruptor
为了提高CPU的速度,Cpu有高速缓存Cache,该缓存最小单位为缓存行CacheLine,他是从主内存复制的Cache的最小单位,通常是64字节。一个Java的long类型是8字节,因此在一个缓存行中可以存8个long类型的变量。如果你访问一个long数组,当数组中的一个值被加载到缓存中,它会额外加载另外7个。因此你能非常快地遍历这个数组。原创 2022-12-22 14:52:28 · 745 阅读 · 0 评论 -
Java反射和new效率差距有多大?
其中JIT在程序运行期会对程序进行优化,但是反射是通过动态解析的方式,因此可能无法执行某些java虚拟机的优化。new的对象无法访问其中的私有属性,反射出来的可以通过设置setAccessible()方法来省略访问权限符。接下来,程序运行期间,可能会通过一个JIT,即时编译器将字节码文件转换为计算机认识的机器码文件。我们一般都是通过一个前端编辑器,比如javac,把java文件转为class文件。首先第一点,一般我们的Java代码是需要编译后在虚拟机里面运行的。逆向代码 例如反编译。原创 2022-12-22 11:17:57 · 486 阅读 · 0 评论 -
Lambada Java具体用法
import java.math.BigDecimal;import java.util.*;import java.util.stream.Collectors;public class Lambada { public static void main(String[] args) { List<Apple> appleList = new ArrayList<>();//存放apple对象集合 Apple apple1 =原创 2022-05-25 16:45:07 · 211 阅读 · 0 评论 -
读懂Java虚拟机JVM
原创 2021-11-04 19:40:29 · 143 阅读 · 0 评论 -
堆外内存---Java的一块飞地
1、什么是堆外内存?通常,我们在Java中创建的对象都处于堆内内存(heap)中,堆内内存是由JVM所管控的Java进程内存,并且它们遵循JVM的内存管理机制,JVM会采用垃圾回收机制统一管理堆内存。与之相对的是堆外内存,存在于JVM管控之外的内存区域,Java中对堆外内存的操作,依赖于Unsafe提供的操作堆外内存的native方法。2、为什么要使用堆外内存?对垃圾回收停顿的改善。由于堆外内存是直接受操作系统管理而不是JVM,所以当我们使用堆外内存时,即可保持较小的堆内内存规模。从而在GC时减少回原创 2021-08-02 21:01:21 · 235 阅读 · 0 评论 -
红黑树插入原理
红黑树性质1、每个结点或是红色的,或是黑色的2、根节点是黑色的3、每个叶结点(NIL)是黑色的4、没有两个相邻的红色节点5、对于每个结点,从该结点到其叶子结点构成的所有路径上的黑结点个数相同。和AVL树的比较AVL树是一棵严格的平衡树,它所有的子树都满足二叉平衡树的定义。因此AVL树高被严格控制在XXX,因此AVL树的查找比较高效。但AVL树插入、删除结点后旋转的次数比红黑树多。红黑树用非严格的平衡来降低插入删除时旋转的次数。因此,如果你的业务中查找远远多于插入、删除,那选AVL树;如果原创 2021-03-09 14:18:10 · 318 阅读 · 0 评论 -
Java浅谈
1、HashMap是有序的吗?2、有没有有顺序的一个map实现类?TreeMap、LinkedHashMap3、TreeMap、LinkedHashMap是如何保证他的顺序的?哪个有序的实现比较好?你觉得有没有更高效的实现方式?4、HashMap是线程安全的吗?并发下使用的是什么Map?5、CurrentHashMap的实现原理?比如扩容、HashCode、存储方式、默认容量6、has...原创 2020-04-11 10:34:50 · 459 阅读 · 0 评论 -
Java文件读操作(两种read方法)
将文件中的数据读入程序,是将程序外部的数据传入程序中,应该使用输入流——InputStream或Reader。而由于读取的是特定的数据源——文件,则可以使用输入对应的子类FileInputStream或FileReader实现。 在实际书写代码时,需要首先熟悉读取文件在程序中实现的过程。在Java语言的IO编程中,读取文件是分两个步骤: 1、将文件中的数据转换为流(由系统完成,只需要创建原创 2017-10-09 14:44:34 · 31482 阅读 · 5 评论 -
线程本地ThreadLocal的介绍与使用
1、ThreadLocal简介我们通过上两篇的学习,我们已经知道了变量值的共享可以使用public static变量的形式,所有的线程都使用同一个被public static修饰的变量。那么如果我们想实现每一个线程都有自己的共享变量该如何解决哪?JDK提供的ThreadLocal正是为了解决这样的问题的。类ThreadLocal主要解决的就是每个线程绑定自己的值,可以将ThreadLocal类比喻成原创 2017-10-18 12:06:19 · 870 阅读 · 0 评论 -
两种常用的线程计数器CountDownLatch和循环屏障CyclicBarrier
一、倒计时CountDownLatchCountDownLatch是一个非常实用的多线程控制工具类,称之为“倒计时器”,它允许一个或多个线程一直等待,直到其他线程的操作执行完后再执行。 举了例子: 我们知道的集齐七颗龙珠就可以召唤神龙,那我们就一起召唤一下,下边我需要派7个人(7个线程)去分别去找这7颗不同的龙珠,每个人找到之后回来告诉我还需要等待的龙珠个数减1个,那么当全部的人都找到龙珠之后,转载 2017-10-18 16:50:49 · 530 阅读 · 0 评论 -
ThreadLocal出现OOM的场景和原理分析
一个线程数为500的线程池,所有线程共享一个ThreadLocal变量,每一个线程执行的时候插入一个大的List集合。原创 2017-10-23 14:43:46 · 4089 阅读 · 1 评论 -
Java动态代理
1、什么叫动态代理“所谓运行时对类进行修改,打个比方来说,我写了一个HelloWorld的类,其中有两个方法:sayHello()和sayHelloToPHP(), 然后这个类运行起来了,我们希望在运行的时候可以修改这类: 1、加一个新方法sayHelloToPython(); 2、现在的sayHello()方法里加一点新东西; 3、把sayHelloToPHP()这个方法删转载 2017-10-13 12:02:30 · 365 阅读 · 0 评论 -
Java多线程编程-单例模式几种写法的错与对
一、背景知识在所有的主流23中设计模式中,单例模式作为最简单也最容易理解也是使用最普遍的设计模式,他是一种对象创建模式,用于产生一个对象的具体实例,他可以确保系统中一个类只产生一个实例。单例模式的优点如下: 1、对于频繁创建的对象,可以省去new的操作锁花费的时间,对于一些重量级的对象创建来说可以说是一笔开销的节省; 2、由于new的次数变少了,系统内存的使用频率也会降低,这也减轻了G转载 2017-10-26 15:34:39 · 346 阅读 · 0 评论 -
JAVA项目中发布WebService服务—简单实例
1,在Java项目中发布一个WebService服务:如何发布? JDK1.6中JAX-WS规范定义了如何发布一个WebService服务: (1)用jdk1.6.0_21以后的版本发布; (2)与Web服务相关的类,都位于Javax.jws.*包中:@WebService——此注解用在类上指定将此类发布成一个WebService;EndPoint——此类为端点服务类,其中publish(原创 2017-11-23 16:24:02 · 27568 阅读 · 3 评论 -
什么是volatile关键字
原创 2017-12-27 玻璃猫 码农翻身1、Java内存模型JMM在解释volatile关键字之前,我们需要先了解一下Java的内存模型。 Java内存模型简称JMM(Java Memory Model),是Java虚拟机所定义的一种抽象规范,用来屏蔽不同硬件和操作系统的内存访问差异,让java程序在各种平台下都能达到一致的内存访问效果。Java内存模型长成什么样子呢?就是下图的样子:转载 2017-12-29 16:52:37 · 446 阅读 · 0 评论 -
线程的私家领地:ThreadLocal
原创 2018-01-31 老刘 码农翻身 张大胖上午遇到了一个棘手的问题,他在一个AccountService中写了一段类似这样的代码: 然后这个AccountService 调用了其他Java类,不知道经过了多少层调用以后,最终来到了一个叫做AccountUtil的地方,在这个类中需要使用Context中的trackerID来做点儿事情: 很明显,这个AccountUtil没有办法转载 2018-02-04 09:39:09 · 677 阅读 · 0 评论 -
sql注入的方法
原创 2018-01-15 老刘 码农翻身1、什么是sql注入“原理非常简单,比如网站有个users表格,数据如下:” “这个网站有个功能,根据id来查看用户信息,http://xxxx.com/user?id=xxxx, 对应的SQL可能是这样的:”string sql =”SELECT id , name, age from users WHERE id=”+;如果用户在浏览器的URL 是 h转载 2018-01-20 16:08:02 · 1191 阅读 · 1 评论 -
泛型与反射
1、泛型1、编译时干的事,用具体的类型代替泛化的类型。 2、和类的创建没关系,就是相当于存在类里的一个信息(或者说一个属性)。 3、有的泛型声明在类上,有的泛型声明在方法上,作用域不同。 4、在继承的时候使用泛型有两种方式:要么在子类中也声明泛型, public class Generic<T> extends A<T>要么在子类中将泛型写成具体类型,public class Gene原创 2018-03-16 16:20:46 · 1010 阅读 · 0 评论 -
java中处理异常的9个注意事项
异常:检查异常(编译时异常:try catch或声明抛出) 非检查异常(运行时异常:比如:除0异常,事务中默认回滚的都是“非检查异常”)1、清理 Finally 块中的资源,或使用 Try-With-Resource 语句在 try 块中使用资源时常发生,比如 InputStream ,是需要在用完之后关掉的。一个通常发生的错误是,在 try 块的末尾关掉资源: 顺利的话,只要...转载 2018-03-12 21:03:12 · 2230 阅读 · 0 评论 -
内存溢出和内存泄漏的区别
内存溢出:就是内存中存内容的地方不够用了,导致溢出到存引用的地方了,黑客就是利用这种技术修改你的内存引用,指向黑客的程序代码上,从而攻击电脑。内存泄漏:内存泄漏是申请的空间没有及时释放或者干脆丢了指针没法释放.不是泄漏,是漏不出来;只是泄漏的内存远小于可分配的内存时影响不大,多了就玩完. 比如你想买1000块的东西,你资产正好1000,但是有张银行卡密码忘记了,钱取不出来没法用,但是你明明有钱,不原创 2018-03-12 21:19:59 · 242 阅读 · 0 评论 -
一文看懂Lambda
1、什么是Lambda?我们知道,对于一个Java变量,我们可以赋给其一个“值”。如果你想把“一块代码”赋给一个Java变量,应该怎么做呢?比如,我想把右边那块代码,赋给一个叫做aBlockOfCode的Java变量:在Java 8之前,这个是做不到的。但是Java 8问世之后,利用Lambda特性,就可以做到了!当然,这个并不是一个很简洁的写法。所以,为了使这个赋值操作更加优雅 我们可以移除一些没用的声明。这样,我们就成功的非常优雅的把“一块代码”赋给了一个变量。而“这块代码”,或者说“转载 2018-03-06 09:52:49 · 11921 阅读 · 7 评论 -
时间复杂度与空间复杂度
1、时间复杂度:计算次数时间复杂度就是程序的计算次数常数*常数 : O(1) 变量:O(n) 变量*常数:O(log2n) 变量*变量O(n^2)比如:数组根据下标查询的复杂度为O(1),不根据下标查(遍历加比较)的时间复杂度为O(log2n)2、空间复杂度空间复杂度就是运行时需要占用的内存空间原创 2018-03-19 13:49:41 · 398 阅读 · 0 评论