- 博客(27)
- 收藏
- 关注
原创 【JAVA】经典的生产者-消费者
本文介绍了Java中生产者-消费者模型的实现。通过Buffer类作为共享缓冲区,使用synchronized、wait()和notifyAll()确保线程安全,实现了生产者(Producer)和消费者(Consumer)的协同工作。生产者不断生成数据放入缓冲区,消费者取出数据,当缓冲区满或空时自动等待并通过通知机制唤醒对方。关键点包括:使用while循环防止虚假唤醒,设置随机休眠模拟处理时间,缓冲区容量限制为5。该模型有效解决了多线程环境下的资源共享问题。
2025-12-01 23:02:23
197
原创 【JAVA并发】ReentrantLock源码分析背后的AbstractQueuedSynchronizer
本文通过源码分析Java中ReentrantLock的实现机制,重点研究了无竞争和有竞争两种场景下的加锁与释放流程。在无竞争情况下,通过CAS操作直接获取锁;当存在竞争时,未获取锁的线程会被阻塞并加入等待队列。文章详细展示了线程获取锁失败后的处理流程,以及锁释放时如何唤醒等待线程的过程。通过实际代码示例和调试截图,直观呈现了ReentrantLock内部AQS(AbstractQueuedSynchronizer)的工作原理,包括state状态管理、线程阻塞与唤醒机制等核心内容,帮助读者深入理解Java并发
2025-11-29 00:28:17
430
原创 【JAVA】synchronized深入研究
本文总结了Java中synchronized的三种应用方式及其实现原理:1)同步实例方法锁定当前对象实例;2)同步静态方法锁定类对象;3)同步代码块锁定指定对象。通过字节码分析揭示了synchronized通过monitorenter/monitorexit指令实现原子性,并详细解析了Java对象头结构,包括Mark Word在不同锁状态(无锁、偏向锁、轻量级锁、重量级锁)下的存储格式变化。文章从语法使用到底层实现,系统性地阐述了Java锁机制的工作原理。
2025-11-28 00:06:56
943
原创 【JAVA】字节码分析++i和i++的区别和i=i++失效
本文通过字节码分析对比了Java中i++和++i的区别。使用IDEA的jclasslib插件查看字节码,发现res = res++无效的原因是:先将res值压栈,再对局部变量res加1,最后栈顶的旧值又覆盖了局部变量。而res = ++res有效,因为先对局部变量res加1,再将新值压栈存储。这揭示了Java基于栈执行的本质,解释了为何i = i++不会改变i的值。
2025-11-27 00:30:03
862
原创 【JAVA并发】Thread线程状态和状态切换实战
本文通过两个示例演示了Java线程的BLOCKED状态。第一个示例使用synchronized关键字展示两个线程竞争锁资源时,未获得锁的线程会处于BLOCKED状态。第二个示例模拟生产者-消费者模式,展示了调用wait()方法后线程从RUNNABLE转为WAITING,被notifyAll()唤醒后转为BLOCKED状态重新竞争锁。文中还强调了volatile关键字保证可见性但不保证原子性,以及wait()必须在同步块中使用等注意事项。通过线程状态监控输出,直观呈现了线程状态变化过程。
2025-11-26 00:42:37
695
原创 【java spi原理】搭配maven profile使用
本文介绍了如何利用Java SPI机制与Maven Profile实现多环境权限校验方案。通过定义统一的Auth接口,分别实现IAM和SSO两种认证方式,利用META-INF/services配置文件声明实现类,配合Maven Profile实现不同环境的差异化打包。项目包含父工程(spi-demo)和四个子模块:基础权限框架(auth)、业务服务(biz-service)以及两种认证实现(auth-iam/auth-sso)。这种方案有效解决了同一套代码在不同环境下使用不同鉴权机制的需求,展示了SPI动态
2025-11-12 23:41:48
922
原创 【docker】Windows和Vmware和docker容器IP互相访问
Docker容器配置独立IP,windows和vmware虚拟机和docker容器IP访问解决方案
2025-11-11 01:50:16
580
1
原创 【Docker】网络模式和宿主机访问
本文介绍了Docker的四种网络模式:Bridge、Host、Macvlan和Container。Bridge是默认模式,容器通过虚拟网桥互联;Host模式直接共享宿主机网络栈;Macvlan为容器分配独立IP,使其像物理主机一样存在于局域网;Container模式未展开讨论。每种模式各有特点:Bridge适合隔离环境,Host性能最优,Macvlan提供独立IP访问。通过部署Nginx容器测试,展示了不同模式下的网络配置和访问方式差异,帮助理解Docker网络工作原理。
2025-10-18 16:45:56
1026
原创 【Propagation.NOT_SUPPORTED使用不当会锁超时?】
1、innodb_trx结果显示 6231是delete方法的事务,6228是整体事务,事务6228锁住了这两条记录,事务6231想要对一行记录加锁,但是和之前的事务部分重合了导致等待锁(不会释放,已经死锁了,事务6228不会提交也不胡回滚,导致会获取锁超时)trx_requested_lock_id:事务当前正在等待锁的标识,可以和 INNODB_LOCKS 表 JOIN 以得到更多详细信息。trx_tables_in_use:当前事务执行的 SQL 中使用的表的个数。
2024-06-28 01:45:57
2192
原创 java8 lambda 将数组转换成map
有时候,需要简洁的将list类型的对象转换成Map<String,Object>转换代码public static void main(String[] args) { // 初始化数据 ArrayList<User> users = new ArrayList<User>() {{ add(new User("666666", "大顺", 16)); add(new User("5211314", "杀马特", 30));
2022-05-23 23:24:49
2037
原创 excel下拉框引用另一个sheet数据
excel数据准备在年级表创建两个年级全选单元格,带年纪数据验证,输入 “=年级!A:A:A:A”,引用年级,这样子班级表头也会有下拉框,点击班级那个单元格再点击数据验证,点击全部清除再确定以上操作就可以用在表头下面任意一个单元格选择下拉框...
2022-04-20 00:31:08
11106
原创 java lambda 统计数组中每个元素出现的次数
在处理 leecode 算法颜色划分 采用非算法的思想解https://leetcode-cn.com/problems/sort-colors/solution/yan-se-fen-lei-by-leetcode-solution/对于stream流的操作 需要将基本类型进行装箱1:将int[]转换成map集合Map<Integer, Long> map = Arrays.stream(nums).boxed() .collect(Collectors.group
2022-04-02 09:41:11
1788
原创 springboot 默认事务 代码示例
springboot 事务 代码示例Ⅰ同一个类内默认传播级别的调用1.1 方法addTeacher带默认传播级别的事务调用没事务的方法updateTeacher @Transactional(propagation = Propagation.REQUIRED) @Override public void addTeacher(String name, String code) { Teacher teacher = new Teacher(name, code); mappe
2022-02-24 18:26:24
1935
原创 java8 lambda 将二维数组转换成list集合
将二维数组int[][]转换成一个嵌套的List<List> 的形式代码如下public static List<List<Integer>> generate(int numRows) { int[][] ints = new int[numRows][numRows]; for (int i = 0; i < numRows; i++) { for (int j = 0; j <= i; j++) { if
2022-02-07 11:22:49
5783
1
原创 springboot整合netty和sleuth和MDC生成traceId
springboot整合netty,利用slf4j的MDC来生成traceId做链路追踪,sleuth配合使用【sleuth和MDC可选择不使用,那就不需要编写aop和注解,不需要引入aop和sleuth】。1:所需要依赖的jar(根据自己需求选择) <!-- 版本管理 --> <dependencyManagement> <dependencies> <dependency>
2021-11-29 01:06:21
3333
原创 springBoot整合easyexcel两种方式
一、依赖引入<dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</artifactId> <version>2.2.7</version> </dependency>在这需要引入easyexcel的jar(必须),在实际项目还会引入 <dependency>
2021-11-02 22:49:46
1002
原创 springboot整合mybatis编写自定义的转换器(boolean到tinyint)
写一个typeHandle(具体JDBC和JAVA映射查看表)mybatis官网package com.gyg.converter;import org.apache.ibatis.type.BaseTypeHandler;import org.apache.ibatis.type.JdbcType;import java.sql.CallableStatement;import java.sql.PreparedStatement;import java.sql.ResultSet;i
2021-07-05 15:17:07
1580
原创 算法-排序算法汇总
冒泡排序思路:采用的是双循环的方法,冒泡排序按照理解是吧大的往后移,每一循环一次将最大的移到后面,最后一个位置即固定了。当然冒泡可以冒小泡,这样就是方向排序,排出来的是逆序代码: /** * 冒泡排序 * @param a */ protected static void bubbleSort(int[] a) { for (int i = 1; i < a.length; i++) { for (int j
2021-06-28 10:40:48
129
原创 SpringBoot整合eureka异常:java.lang.ArrayStoreException: sun.reflect.annotation.TypeNotPresentExceptionPr
原因发生原因是因为eureka的版本升级导致里面有一些jar只存在编译期,编译没问题运行有问题问题呈现进入eureka pom有异常的高版本引起的原因就是这个jar,运行时找不到的。如何定位bug注意这里要debug运行添加抛异常的点添加完毕再次debug运行,会直接跳到即将抛异常的时刻点击链接去抛异常的点会发现如下问题,自动装配找不到类了,在本页查找会发现有些类找不到,既然能编译能通过,那么为什么又会找不到呢,我们去pom(按 CTRL+N)查找也找不到所以只能看e
2021-03-27 11:47:45
909
1
原创 List方法remove()
List方法remove当值和索引都是int类型的时候会不会出现特殊的结果?代码 ArrayList<Integer> list = new ArrayList<>(); list.add(1); list.add(2); list.add(3); list.add(4); for (int i = 0; i <= list.size(); i++) {
2021-03-16 15:51:50
283
原创 leetcode-两数之和-java
描述给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。示例:给定 nums = [2, 7, 11, 15], target = 9因为 nums[0] + nums[1] = 2 + 7 = 9所以返回 [0, 1]思路采用hashmap,整数用于做map的key,如此查找为线性的。代码 //HashMap实现 public
2020-12-28 15:58:59
129
原创 leetcode-两数相加-java
描述两数相加给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。您可以假设除了数字 0 之外,这两个数都不会以 0 开头。示例:输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)输出:7 -> 0 -> 8原因:342 + 465 = 807思路两个链表同时移动,谁先到达空,谁不移动,移动非空
2020-12-28 15:50:44
189
原创 八皇后问题JAVA
题目描述八皇后问题是一个古老而著名的问题,是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出的,在8*8格的国际象棋上摆放八个皇后;使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上;问有多少种摆法, 输出所有可能的解?代码public class Main19 { private static int max = 8; private static int[] array = new int[max]; private stat
2020-12-15 00:29:11
606
2
原创 输入当前回文数是第几个
输入当前回文数是第几个(java)题目描述"回文数"是一种数 字。如:98789, 这个数字正读是98789,倒读也是98789,正读倒读一样,所以这个数字就是回文数。现在给你一个回文数n(0<n<10^9),让你求出这个数是第几个的回文正整数。输入输入回文数n(0<n<10^9).输出这个数是第几个的回文正整数。思路不需要判断增长的数是否为回文数,因为折半之后自己可以创造回文java代码``public class Main {public static vo
2020-12-12 19:07:49
211
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅