java基础
文章平均质量分 65
佐杰
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
锁性能基准测试
Java多线程锁性能测试报告摘要:在Java 17环境下,对8种同步机制进行百万次操作测试。结果显示,单线程下同步代码块和专用锁对象性能最优(200M ops/s),多线程下分段锁表现最佳(25M ops/s)。ReentrantLock和StampedLock在高并发时吞吐量下降明显(约55M ops/s vs 5M ops/s)。同步静态方法在100线程时仍保持14.7M ops/s的吞吐量,而同步实例方法为11.9M ops/s。测试表明,不同场景下应选择合适的锁机制:低竞争时同步代码块最优,高并发时原创 2025-08-12 22:43:09 · 382 阅读 · 0 评论 -
什么是ABA问题?
ABA问题是CAS操作中因值被多次修改最终恢复原值而引发的并发问题。演示显示账户余额从100→50→100,线程1未能感知中间变化仍执行转账,导致非法操作被掩盖。解决方案是使用AtomicStampedReference添加版本戳来跟踪每次修改,确保数据变化的可观测性。该问题在金融、库存等场景可能造成严重后果。原创 2025-08-10 21:22:13 · 519 阅读 · 0 评论 -
在 JDK 17 上完整观察 synchronized 锁升级过
摘要:本文通过代码演示了JDK 17中synchronized锁的完整升级过程。程序使用Unsafe类和JOL工具分析对象头信息,展示了从无锁状态(001)到偏向锁(101)、轻量级锁(000),最终到重量级锁(010)的完整升级路径。每个阶段都输出了对象内存地址、Mark Word值和锁状态位,并提供了详细的二进制状态说明。特别处理了不同线程竞争时的锁状态变化,为理解Java锁机制提供了直观的观察方法。原创 2025-08-10 16:39:07 · 525 阅读 · 0 评论 -
Hashmap为什么要保持两倍扩容
这使得hash & (capacity - 1)等价于取模运算hash % capacity,但速度快10倍以上。当元素数量超过 8 × 0.75 = 6 时触发扩容(当前6个元素,刚好达到阈值)使用公式:newIndex = hash & 15(因为16-1=15)例如容量10:9 → 二进制 01001,hash & 9不能均匀分布。1.5倍扩容:元素可能迁移到5个不同位置。新位置:11(原位置3 + 旧容量8)新位置:1(与原位置相同)新位置:3(与原位置相同)新位置:5(与原位置相同)原创 2025-08-10 11:43:04 · 445 阅读 · 0 评论 -
异或运算的高位分析
本文介绍了HashMap的实现原理,包含两张示意图展示其内部结构,并提供了相关源码地址。图示展示了HashMap的存储结构和哈希冲突处理方式。源码位于GitHub仓库的java-core-principles项目中,具体路径为collections/HashMap/hashmap.html,可供开发者进一步研究HashMap的实现细节。内容简明扼要地呈现了HashMap的核心实现要素。原创 2025-08-07 00:13:09 · 401 阅读 · 0 评论 -
动手实现一个可发送短信随机密码的高安全性用户密码系统
现假设我们是某个社交网站,对于每个新来的用户,我们可能都需要注册之后,才能进行使用网站的功能,但是对于注册流程,可能每个网站的流程都不一样,假设我们社交网站的注册流程为,先填写用户名和手机号,点击注册之后,系统注册成功之后,会创建一个随机密码,通过短信发送给用户,以后用户可以用该密码进行登录,也可以自己修改密码,我们来看一下整体的业务流程图。通过ThreadLocal来实现高安全性用户密码系统发送随机密码案例。用一个异步方式去处理随机密码的生成和随机密码短信的下发的任务,请看下图。原创 2024-06-25 20:55:32 · 1109 阅读 · 0 评论 -
线程本地化存储如何保证线程安全
我们把代码还原到图中,int c = a + b,基本类型的局部变量是存在栈空间,而new Object()代码创建的的对象实例的确是存在虚拟机的堆空间里,但是Object object只是引用(reference)堆空间里的对象,重要的事情说三遍,是引用,是引用,是引用,而new Object()这个对象只有被当前线程的自己所引用,我们再来看下面这张图。因为变量不共享,就不存在线程安全问题。当方法返回的时候,方法对应的栈帧,也会在栈空间被弹出,同时,执行的方法和对应的栈帧是同生共死的关系。原创 2024-06-18 13:57:43 · 1028 阅读 · 0 评论 -
探秘提交任务到线程池后源码的执行流程
7]如果说线程池状态确实是RUNNING,也就是二次校验通过,那么就判断一下线程池里是否还有线程,通过WorkerCountOf(recheck) == 0来判断,如果返回true了,就说明当前线程池中是空的,没有线程。对于核心线程来说,他们可以无限制的等待着任务被获取并执行,而非核心的线程则是在有限的时间内获取任务,一旦Worker无法获取到任务,也就是要获取的任务为空,循环就会结束,Worker自己就会主动的去除掉在线程池中的应用,进而被回收掉并退出。这个方法实际上最终就是开启了新的线程去执行任务。原创 2024-06-17 17:16:14 · 1133 阅读 · 0 评论 -
分析线程池的构造过程,追踪核心成员变量
这部分线程给他们分配了一个keepAliveTime参数,意义在于,当没有可处理的任务时,让它们别急着回收,而是先等会儿,看有没有任务来了,如果有就去执行任务,否则就等达到了keepAliveTime之后,对工作线程进行回收。也就是上图中的“最大池maximumPool”的容量,它的作用在于,当核心线程数被任务占满,且其中的任务缓冲队列也满了的时候,让新提交的任务仍旧可以执行,不至于立马就被拒绝。如下图中的核心池Pool中的线程池的数量,代表的含义就是这里的corePoolSize,如图。原创 2024-06-17 16:52:50 · 989 阅读 · 0 评论 -
如何避免重复创建线程?创建线程池的方式有哪些?各自优缺点有哪些?
这里还要强调的一点是,在Java语言中,当我们每创建一个线程的时候,Java虚拟机就会在JVM内存中创建出一个Thread对象,与此同时创建一个操作系统的线程,最终在系统底层映射的是操作系统的本地线程(Native Thread),在windows系统中是1对1映射(即一个Java线程映射一个操作系统线程),在Linux系统是N对M映射(即多个Java线程映射多个操作系统线程,N与M不完全相等),这里就仅做了解,不详细展开了,感兴趣的同学可以去看一下操作系统的线程部分的知识。这玩意儿也是要占用内存空间的。原创 2024-06-16 11:12:46 · 1408 阅读 · 0 评论 -
实现智能安防系统的报警功能(一)
这些产品都需要报警功能,一旦监察到异常,就会向报警中心服务器上传报警信息,然后由报警中心程序通知对应的人员或者系统进行处理。建立定时器,并每隔5秒发送一次心跳检查,如果与告警中心服务器的连接断开,则重新建立连接。HeartbeatTask()心跳检查,新建定时调度线程,每隔n秒去检查一次连接。init: 初始化报警服务,和报警服务器建立连接,并定时发送心跳信息。通过blocker去唤醒一个线程,与告警中心服务器建立连接。4、烟雾报警器、燃气探测器。3、门磁、人体探测器。原创 2024-06-16 10:17:37 · 532 阅读 · 0 评论 -
如何解决百万交易系统转账过程中循环等待,性能太差的问题?
死锁” 是两个或两个以上的线程在执行过程中,互相持有对方所需要的资源,导致这些线程处于等待状态,无法继续执行。若无外力作用,它们都将无法推进下去,就进入了“永久”阻塞的状态。如上图所示:线程01获得了账户A的锁,且同时去尝试获取账户B的锁;但是,线程02已经获得了账户B的锁,所以,线程01只能等待。同样,线程02也无法获得账户A的锁(已被线程01获取),只能等待。于是,线程01和线程02都在等待对方持有的锁,且会无限期的等待下去,这就是我们所说的“死锁”了!原创 2024-06-15 21:29:11 · 1037 阅读 · 0 评论 -
线程在执行过程中的状态是如何流转的?
当线程的run()方法完成时,或者主线程的main()方法完成时,我们就认为它终止了。线程一旦终止了,就不能复生。所以,当这个线程要执行时,就必须调用这个对象的start()方法,将NEW 状态转换到 RUNNABLE 状态。线程执行完 run() 方法后,会自动转换到 TERMINATED 状态,当然如果执行 run() 方法的时候异常抛出,也会导致线程终止。我们为了验证线程run()后,会自动转到terminated状态,所以,使用thread.getState()方法来获取“线程状态”。原创 2024-06-15 20:57:06 · 940 阅读 · 0 评论 -
使用无界队列的线程池,在远程服务异常的情况下导致内存飙升怎么办?
只要有一个Worker异常挂掉,此时就会把这个worker从线程池里给挪出去,然后判断一下,如果当前线程数量 < corePoolSize,就会重新创建一个Worker和线程放入线程池中,自己再搞一个补位。可以考虑自己定制线程池,使用有界队列,不要使用无界队列,可以限制内存空间的使用,避免系统崩溃;无界队列,直接支撑前端的请求,不允许有界阻塞,到最后大不了就是系统崩溃。如果你提交到线程池的任务报错了,抛了异常出来,在线程池执行的过程中,Worker层面接收到一个异常,会直接throw抛出去。原创 2024-05-23 18:25:45 · 455 阅读 · 0 评论 -
死锁定位与解决方案
1.源码如下 package cn.haochen.locak; /** * @author haochen * desc:死锁模拟程序 */ public class DeadLockDemo { public static void main(String[] args) { DeadLock d1=new DeadLock(true); DeadLock d2=new DeadLock(false); Thread t1=new Thre原创 2021-01-28 18:03:20 · 279 阅读 · 0 评论 -
在实际的使用中,应该如何合理配置核心线程数和队列长度呢?
在实际的使用中,应该如何合理配置核心线程数和队列长度呢? 一个正常的请求有cpu执行时间(比如代码中进行数据的封装和计算等)和等待时间(比如调用dubbo接口等待io的响应结果或者其他等待io的过程中是不占用cpu时间的);核心线程数=cpu核数*(执行时间/(执行时间+等待时间)) ...原创 2021-03-02 19:48:00 · 384 阅读 · 0 评论 -
cpu多级缓存并发架构解析
原创 2020-11-19 10:39:30 · 352 阅读 · 0 评论 -
多线程的三个特性:原子性、可见性、有序性
原子性:是指一个操作是不可中断的。即使是多个线程一起执行的时候,一个操作一旦开始,就不会被其他线程干扰。 比如,对于一个静态全局变量int i,两个线程同时对它赋值,线程A给他赋值为1,线程B给他赋值为-1。那么不管这两个线程 以何种方式。何种步调工作,i的值要么是1,要么是-1.线程A和线程B之间是没有干扰的。这就是原子性的一个特点,不可被中断。 可见性:是指当一个线程修改了某一个共享变量的值,其他线程是否能够立即知道这个修改。显然,对于串行来说,可见性问题是不存在的。 有序性:在并发时,程序的执行可能会原创 2021-05-11 23:14:42 · 1207 阅读 · 0 评论 -
类的信息包含哪些信息
1.类的class对象 也就是类的入口信息 2.类中的方法 3.static修饰的静态变量和常量 4.类的全路径```原创 2020-12-18 10:56:47 · 1346 阅读 · 0 评论 -
java集合之Connection和connections的区别
区别在于: Connection是单列集合的根接口 Connections是集合的工具类原创 2020-09-23 22:26:24 · 2108 阅读 · 0 评论 -
自定义注解
自定义注解一、注解是什么?二、使用步骤1.使用关键字@interface@Target @Retention详解 一、注解是什么? 我们在代码中经常看到@Override @@SuppressWarnings() 等等就是注解 特别在spring编程中看到大量的注解。 二、使用步骤 1.使用关键字@interface 代码如下(示例): /** * 自定义注解 */ public class Test02 { @MyAnnotation2() public void test(){原创 2020-08-26 21:35:00 · 255 阅读 · 0 评论 -
hashmap中寻址算法为什么用&运算不用%运算
hashmap中寻址算法为什么用&运算不用%运算 理由:从计算机层面&运算的效率更高原创 2020-08-16 23:41:44 · 677 阅读 · 0 评论 -
快速失败 (fail-fast) 和安全失败 (fail-safe) 的区别是什么?
描述 java.util包下面的所有集合类都是快速失败的,而Java.util.concurent包下面的集合类都是安全失败。 快速失败 迭代器会抛出ConcurentModificationException异常,而安全失败的迭代器永远 不会抛出这样的异常 快速失败(fail-fast) public class FailFastDemo { public static void main(String[] args) { HashMap hashMap = new HashMap原创 2020-07-01 22:58:18 · 456 阅读 · 0 评论 -
== 与 equals的区别
== 与 equals == : 它的作用是判断两个对象的地址是不是相等。即,判断两个对象是不是同一个对象。PS:基本数据类型比较的是值,引用数据类型比较的是内存地址 equals() : 它的作用也是判断两个对象是否相等 但它一般有两种使用情况: 情况 1:类没有覆盖 equals() 方法。则通过 equals() 比较该类的两个 对象时,等价于通过“==”比较这两个对象。 public ...原创 2019-11-20 15:21:33 · 186 阅读 · 0 评论 -
String StringBuffer 和 StringBuilder 的区别 是什么 String 为什么是不可变的
String StringBuffer 和 StringBuilder 的区别 是什么 String 为什么是不可变的可变性线程安全性性能对于三者使用的总结: 可变性 简单来说 Spring 类中使用了final关键字 字符数组保存字符串 private final char value[],所以String对象是不可变的。而StringBuild和Springbuffer都继承AbstractS...原创 2019-11-20 14:31:01 · 301 阅读 · 0 评论 -
TCP的三次握手
传输控制协议TCP简介 1.面向连接的,可靠的,基于字节流的传输层通信协议 2.将应用层的数据流分割成报文段并发送给目标节点的TCP层 3.数据包都有序号,对方收到则发送ACK确认,未收到则重传 4.使用校验来检验数据在传输过程中是否有误 TCP Flags URG:紧急指针标志 ACK:确认序号标志 PSH:push标志 RST:重置连接标志 SYN:同步序号,用于建立连接...原创 2019-02-25 22:45:55 · 388 阅读 · 0 评论 -
Java的跨平台原理
Java的跨平台原理如图所示: 由于操作系统(windows,linux)等支持指令集,不是完全一致的,就会让我们的程序在不同的操作系统中要执行不同的程序代码,java开发了适用于不同操作系统及位数的java虚拟机来屏蔽各系统之间的差异,提供统一的接口,对于我们Java开发者而言,你只需要在不同的系统上安装对应的不同的java虚拟机,这时你的java程序只需要遵循java规范就可以在所有的操...原创 2019-01-21 15:08:52 · 306 阅读 · 2 评论 -
java基础考点
原创 2019-02-20 21:01:54 · 314 阅读 · 0 评论 -
多线程(一)什么是线程和进程
说起线程和进程 这里就要说下应用程序 什么是应用程序? 应用程序就是可执行的软件 比如说QQ office .exe .bat文件都可以叫做应用程序 在一个应用程序中都会有个进程 什么是进程? 1.进程中有多个不同的执行路径,多个线程的集合。 2.进程是执行中的程序 3.一个操作系统可以有多个进程 总结:进程就是正在运行的程序,是线程的集合。 在进程中程序代码是怎么执行的,代码...原创 2019-03-05 22:03:05 · 250 阅读 · 0 评论 -
多线程(二)为什么要使用多线程?
为什么要使用多线程? 这里举个例子: 在用百度云时(只能单线程运行的情况) 在使用百度云时(可以多线程的运行情况) 总结:使用多线程可以提高程序的效率 ...原创 2019-03-05 22:37:40 · 277 阅读 · 0 评论 -
TCP简单demo
客户端: package com.yfy.net; import java.io.BufferedWriter; import java.io.IOException; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.net.Socket; public class TCPClient {...原创 2019-02-26 21:31:47 · 1074 阅读 · 0 评论 -
多线程(六)守护线程和非守护线程
什么是守护线程?什么是非守护线程? 守护线程是和main有关的 用户线程,用户自己创建的线程,用户创建线程,如果主线程停止掉,不会影响用户线程。 用户线程也叫非守护线程 守护线程的特征:守护线程和主线程一起销毁 非守护线程的特征:非守护线程和守护线程互不影响 非守护线程Demo package com.zuojie; /** * 用户线程 是主线程创建的线程 非守护线程 ...原创 2019-03-13 23:55:39 · 359 阅读 · 0 评论 -
多线程(三)使用继承的方式创建线程
使用继承Thread的方式来创建线程 创建线程 调用线程 这里要说明一下启动线程要通用start方法 线程运行的结果 这里延伸的说明一下同步和异步(从下面这张图可以看到同步通俗的理解就是代码从上往下执行属于单线程的执行方式 异步是有多条执行路径 互不干扰 有多条执行方式 属于多线程的执行方式) 源码下载:https://github.com/issueDriver/bas...原创 2019-03-07 00:34:37 · 651 阅读 · 1 评论 -
多线程(七)多线程的几种状态
线程的几种状态 新建 准备 运行 休眠 停止原创 2019-03-14 21:56:34 · 567 阅读 · 0 评论 -
多线程(五)使用匿名内部类创建线程
直接上代码 package com.zuojie; /** * 功能描述(使用匿名内部类创建线程) * @author zuojie * */ public class ThreadDemo03 { public static void main(String[] args) { //什么是匿名内部类 Thread t1 = new Thread(new Runnable(...原创 2019-03-10 21:42:13 · 449 阅读 · 0 评论 -
多线程(四)使用实现Runnable的方式来创建线程
创建线程 调用线程 执行结果 补充说明 创建线程是使用继成Thread的方式还是通过实现Runnabe的方式好? 我们在一般开发都是面向接口编程 并且通过接口可是实现多继承 这里采用实现Runnale的方式好 源码地址https://github.com/issueDriver/basics/tree/master/demos/Thread_demo01 ...原创 2019-03-08 00:12:39 · 651 阅读 · 0 评论 -
多线程(十)使用多线程分批处理信息
需求分析:现在银行有一批10万的用户,需要给每个用户发一条短信 应该怎么做?假如每条短信的发送时间是1秒 使用单线程 就是10万秒 这时候我们可以用多线程分批处理。 代码实现步骤如下: 代码如下: 实体类 package org.Thread_batch.pojo; /** * 功能描述(用户的实体类) * @author zuojie * */ public clas...原创 2019-03-19 23:42:37 · 1773 阅读 · 0 评论 -
多线程(八)join的用法
描述:此时有两个线程 一个线程A 一个线程B,A线程调用了B的join方法 作用:A等待B线程执行完毕之后(释放我的CPU执行权),再继续执行。 线程正常执行的顺序 package com.zuojie; /** * 线程中join的用法 * * @author zuojie * */ public class ThreadDemo06 { public static ...原创 2019-03-17 23:19:35 · 250 阅读 · 0 评论 -
多线程(九)jion实战demo
需求描述:现在有T1,T2,T3三个线程,你怎么样保证T2在T1执行完毕后执行,T2在T3执行完后执行 Demo如下(这里要注意的是在调用匿名内部类的时候在调用要用final修饰) package com.zuojie; /** * xu * * @author zuojie * */ public class ThreadDemo07 { public static v...原创 2019-03-18 22:13:51 · 372 阅读 · 1 评论 -
多线程(十一)线程安全介绍
什么是线程安全问题? 当多线程同时共享,同一个全局变量或静态变量,做写的操作时,可能会发生数据数据冲突问题。但是做读的操作时是不会发生数据冲突问题 需求如下:100张车票 ,有两个窗口同时抢火车票,请使用多线程模拟抢票效果。 package com.zuojie; /** * @author:zuojie */ public class ThreadTrain implements...原创 2019-04-09 23:42:45 · 226 阅读 · 0 评论
分享