- 博客(54)
- 收藏
- 关注
原创 Java并发编程:Semaphore
获取一个令牌,在获取到令牌、或者被其他线程调用中断、或超时之前线程一直处于阻塞状态。尝试获得令牌,在超时时间内循环尝试获取,直到尝试获取成功或超时返回,不阻塞线程。获取一个令牌,在获取到令牌、或者被其他线程调用中断之前线程一直处于阻塞状态。获取一个令牌,在获取到令牌之前线程一直处于阻塞状态(忽略中断)。通常用于那些资源有明确访问数量限制的场景,常用于限流。尝试获得令牌,返回获取令牌成功或失败,不阻塞线程。释放一个令牌,唤醒一个获取令牌不成功的阻塞线程。信号量可以控制线程的并发数量。
2023-07-04 17:49:03
439
原创 mybatis-generator、idea、eclipse 对getter setter代码生成的异同
数据库表中的 is_delete 字段标志记录是否被删除,该字段映射类型为 Boolean 但是因为其为is开始,mybatis-genertor 的代码生成逻辑和 Idea 的代码生成逻辑不同,导致使用 BeanUtils 进行数据拷贝到时候没有办法正确的拷贝所有的数据字段让我们来看下, 如果我们有 isDelete 和 delete 两个 Boolean 类型的字段, Idea 会认为是一个字段,只能生成 getDelete 和 setDelete 两个方法,丢弃了一个属性,这是不太合理的。
2022-03-17 17:21:14
1456
原创 读书笔记 - 《高效能人士的七个习惯》
习惯一:积极主动积极主动 即采取行动,为自己过去、现在及未来的行为负责,并依据原则及价值观,而非情绪或外在环境来做决定。积极主动的人事改变的催生者,他们摒弃被动的受害者角色,不怨天尤人,发挥了人类四项独特的禀赋–自我意识、良知、想象力和独立意志,同时以由内而外的方式来创造改变,积极面对一切。他们选择创造自己的人生,这也是每个人最基本的决定。习惯二:以始为终所有的事务都要经过两次创造–现在脑海里酝酿,其次才是实际的创造。个人、家庭、团队和组织在做任何计划时,均先拟出愿景和目标,并据此塑造未来,全心投注于
2022-03-07 21:20:39
298
1
原创 GC log
{Heap before GC invocations=304 (full 0): garbage-first heap total 4194304K, used 3152728K [0x00000006c0000000, 0x00000006c0402000, 0x00000007c0000000) region size 4096K, 614 young (2514944K), 6 survivors (24576K) Metaspace used 156708K, capaci
2022-02-18 16:25:58
498
原创 Java表达式解析器
1、阿里巴巴QLExpresshttps://github.com/alibaba/QLExpress/blob/master/README.md由阿里的电商业务规则、表达式(布尔组合)、特殊数学公式计算(高精度)、语法分析、脚本二次定制等强需求而设计的一门动态脚本引擎解析工具。 在阿里集团有很强的影响力,同时为了自身不断优化、发扬开源贡献精神,于2012年开源。2、java的公式计算工具:【JEVAL】开源项目,主页 http://jeval.sourceforge.net主要用于实现计算字符
2022-02-08 17:08:38
3825
原创 面试:Redis
文件事件处理器Redis基于Reactor模式开发了网络事件处理器,这个处理器被称为文件事件处理器。它的组成结构为4部分:多个套接字、IO多路复用程序、文件事件分派器、事件处理器。因为文件事件分派器队列的消费是单线程的,所以Redis才叫单线程模型。...
2021-10-19 00:38:58
128
原创 JDK 8 9 10 特性
JDK8 新特性:1. Lambda 表达式2. 函数式接口3. Stream API 4. 接口中提供默认方法和静态方法5. 新的时间日期API6. 方法引用和构造器调用JDK9 新特性:1. 模块化系统2. String 存储结构变更3. 全新的HTPP客户端API 4. 接口支持私有方法5. 改进 try-with-resourcesJDK10 新特性1. 局部变量类型推断2. 统一垃圾回收接口...
2021-10-18 14:04:05
97
原创 SpringMVC 源码调用过程
前端控制器 DispatchServlet 接收请求HandlerMapping:根据请求的URL查找对应的Handler(Controller对应对的映射)HandlerAdapter:通过适配器进行实际业务处理器(Handler|Controller)的方法Handler(Controller)执行业务逻辑ViewResolver: 处理业务返回结果(JSON、JSP、FreeMarker)protected void doDispatch(HttpServletRequest requ.
2021-10-17 23:32:06
137
转载 Mybatis结构与原理
Mybatis架构与原理一、简介MyBatis 是一款优秀的持久层框架。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集Mybatis可以将Sql语句配置在XML文件中,避免将Sql语句硬编码在Java类中。与JDBC相比:Mybatis通过参数映射方式,可以将参数灵活的配置在SQL语句中的配置文件中,避免在Java类中配置参数(JDBC)Mybatis通过输出映射机制,将结果集的检索自动映射成相应的Java对象,避免对结果集手工检索(JDBC)Mybat...
2021-10-16 00:10:34
152
原创 zookeeper
zookeeper是什么zookeeper 是一个开源的分布式的协调服务Zookeeper保证了如下分布式移植性:顺序一致性原子性单一试图可靠性最终一致性客户端的读请求可以被集群中的任意一台机器处理,如果请求在节点上注册了监听器,这个监听器也是由所连接的zookeeper机器来处理。对写请求,这些请求会同时发给其他zookeeper机器来处理,对于写请求,这些请求会同时发给其他zookeeper机器并且达成一致后请求才会返回成功。因此,随着zookeeper的集群机器增多,读请求的吞吐会
2021-10-13 23:52:53
76
原创 Dubbo and SpringCloud
Dubbo 总体架构Provider :暴露服务的提供方,可以通过Jar或者容器方式启动服务Consumer:调用远程服务的服务消费方Register:服务注册中心和发现中心Monitor:统计服务和调用次数的、调用时间监控中心。Container :服务运行的容器Spring 的核心架构Service Provider:暴露服务的提供方Service Consumer:调用远程服务的服务消费方EureKa:服务注册中心和服务发现中心从整体设计来看,二者模式接近,都要服务提供
2021-10-12 17:02:00
91
原创 面试:线程池
线程池的状态1 RUNNING = ‐1 << COUNT_BITS; //高3位为1112 SHUTDOWN = 0 << COUNT_BITS; //高3位为0003 STOP = 1 << COUNT_BITS; //高3位为0014 TIDYING = 2 << COUNT_BITS; //高3位为0105 TERMINATED = 3 << COUNT_BITS; //高3位为011线程池的具体实现ThreadPool
2021-09-30 01:00:53
75
原创 Chapter 12 Java内存模型与线程
Java 内存模型是围绕并发过程中如何处理原子性、可见性、有序性来建立的。原子性通过 synchronized、LOCK解决可见性一个线程对变量的修改另一个线程能够立即察觉到通过synchronized、LOCK、volatile来解决有序性通过volatile 和 hapen-before原则保证volatile保证共享变量的可见性禁止代码重排序内存屏障lfence 是一种Load Barrier 读屏障sfence 是一种Store Barrier 写屏障mfen.
2021-09-29 14:56:16
75
原创 Chapter 7 虚拟机类加载机制
类加载的时机一个类型从被加载到虚拟机内存中开始,到卸载为止,它的整个生命周期将会经历 加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)、初始化(Initialization)、使用(Using)、卸载(Unloading)七个阶段,其中其中验证、准备、解析这三个阶段统称为连接(Linking)。有且只有6中情况必须对类立即进行“初始化”:遇到new、getstatic、putstatic、或incokestatic这四条字节码指令
2021-09-28 15:21:40
91
原创 ReentrantLock
多线程同步内部如何实现的wait/notify, synchronized, ReentrantLock自旋volatile int status=0;//标识‐‐‐是否有线程在同步块‐‐‐‐‐是否有线程上锁成功void lock(){ while(!compareAndSet(0,1)){}//lock}void unlock(){ status=0;}boolean compareAndSet(int except,int newValue){ //cas操作,修改status
2021-09-24 10:03:46
98
原创 笔记:Chapter 13 线程安全与锁优化
文章目录线程安全哪些对象是线程安全的线程安全的实现方法互斥同步非阻塞同步锁优化适应性自旋锁消除锁粗化轻量级锁偏向锁线程安全当多个线程同时访问同一个对象时,如果不考虑这些线程的调度和执行,也不需要其他额外的操作,得到的结果都是我们期望的结果,则可以认为这个对象是线程安全的。哪些对象是线程安全的不可变量 Immutable被final 声明的对象只要在构造的时候没有出现 this 逃逸这个对象就可以说是线程安全的。1.1 对于基本数据类型,定义时声明为 final 即可1.2 对于对象数据类型
2021-09-24 00:26:31
101
转载 面试:HTTP的请求方法 GET、HEAD、POST、PUT、DELETE、CONNECT、OPTIONS、TRACE 说明
超文本传输协议(HTTP, HyperText Transfer Protocol)是一种无状态的协议,它位于OSI七层模型的传输层。HTTP客户端会根据需要...
2021-09-23 21:17:41
350
转载 HTTP和HTTPS协议
<svg xmlns="http://www.w3.org/2000/svg" style="display: none;"> <path stroke-linecap="round" d="M5,0 0,2.5 5,5z" id="raphael-marker-block" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></path>...
2021-09-23 17:57:47
175
原创 面试:计算机网络 TCP/IP 通信过程及相关协议
通信过程及相关协议在网络通信的过程中,将发出数据的主机称为源主机,接收数据的主机称为目的主机。当源主机发出数据时,数据在源主机中从上层向下层传送。源主机中的应用进程先将数据交给应用层,应用层加上必要的控制信息就成了报文流,向下传给传输层。传输层将收到的数据单元加上本层的控制信息,形成报文段、数据报,再交给网际层。网际层加上本层的控制信息,形成IP数据报,传给网络接口层。网络接口层将网际层交下来的IP数据报组装成帧,并以比特流的形式传给网络硬件(即物理层),数据就离开源主机。链路层以太网协议规定,接入网
2021-09-23 16:00:11
839
原创 面试:Dubbo
文章目录什么是RPCDubbo 是最常用的RPC框架之一什么是RPCRPC:远程调用。最终解决的问题:让分布式或者微服务系统中不同服务之间的调用像本地调用一样简单。调用过程:client 调用某个函数方法;client stub 把这个调用的信息封装起来(调用的函数、参数等信息), 称之为编码;client stub 查找要调用的服务,通过网络通信发送到服务提供方;server stub 接收到调用请求后,反序列化传送过来的信息,称之为解码;server stub 找到要实际调用的方法
2021-09-22 00:51:57
73
原创 面试:MySQL的锁机、多版本并发控制机制、BufferPool 缓存机制
事务定义事务是由一组SQL语句组成的逻辑处理单元,事务具有以下4个属性,通常简称为事务的ACID属性。原子性(Atomicity):事务是一个原子操作单元,其对数据的修改,要么全都执行,要么全都不执行。一致性(Consistent):在事务开始和完成时,数据都必须保持一致状态。这意味着所有相关的数据规则都必须应用于事务的修改,以保持数据的完整性。隔离性(Isolation):数据库系统提供一定的隔离机制,保证事务在不受外部并发操作影响的“独立”环境执行。这意味着事务处理过程中的中间状态对外部是不可
2021-09-19 18:45:04
129
转载 面试:B+树和B树的区别_通俗易懂的图文 红黑树,B树,B+树 本质区别及应用场景
话说两个多月前,小史通过了 A 厂的一面,两个多月后的今天,小史终于等到了 A 厂的二面。 在简单的自我介绍后,面试官看了看小史的简历,开始发问了。 面试现场 小史:没问题,这个项目前端用的 React+Webpack,后端用的 Nginx+Spring Boot+Redis+MySQL,前后端是分离的,最后用 Docker 进行容器化部署。主要模块有师生系统、课程系统...
2021-09-18 11:18:44
289
原创 面试:索引和一条SQL是如何执行的
SQL执行流程图连接 :建立连接,进行身份权限校验,将权限等信息放入session中查询缓存: 执行语句前首先查缓存(缓存命中率太低,已经被移出)分析器:检查SQL 语法是否正确。优化器:将SQL优化为最佳执行方案。在表里面有多个索引的时候,决定使用哪个索引。在一个语句有夺标关联的时候,决定表的连接顺序。执行器:执行语句,从存储引擎返回语句。作者:Fsn_soul链接:https://www.jianshu.com/p/5c1805c6f0ff来源:简书著作权归作者所有。商
2021-09-17 18:13:54
181
原创 面试:HashMap 分析
HashMap哈希表: 在哈希表中进行查找、添加和删除等操作性能十分高,在不考虑哈希冲突的情况下,仅需要一次定位即可完成,时间复杂度为O(1)。HashMap 的实现在JDK1.7 中 HashMap 是基于数组和链表实现,在哈希冲突较多的情况下索引效率较慢;在JDK1.8 中HashMap 其实现方式修改为数组 + 链表 + 红黑树。JDK1.7 事项方式如下图JDK 1.8 实现方式如下图HashMap.put根据 key 的hash值进行与运算,计算出元素在数组中存放的位置如果如
2021-09-14 12:33:54
68
原创 面试: ArrayList 和 LinkedList 区别
ArrayList 和 LinkedList 区别底层数据结构不同ArrayList 是基于数组实现,内部维护了一个数组,数组在内存中是一块连续的空间。/** * The array buffer into which the elements of the ArrayList are stored. * The capacity of the ArrayList is the length of this array buffer. Any * empty Arra
2021-09-13 21:36:33
77
原创 RocketMQ 安装
下载 wget https://archive.apache.org/dist/rocketmq/4.7.1/rocketmq-all-4.7.1-bin-release.zipunzip rocketmq-all-4.7.1-bin-release.zip 三台机器192.168.239.81192.168.239.82192.168.239.83#所属集群名字,名字一样的节点就在同一个集群内brokerClusterName=rocketmq-cluster#broker名字,名字
2021-09-01 19:40:54
72
原创 CentOS 安装openJDK
卸载JDKCentos7一般都会带有自己的openjdk,我们一般都回用oracle的jdk,所以要卸载查询系统是否以安装jdk,如果有进行卸载#rpm -qa|grep java大概会得到如下结果[root@localhost ~]# rpm -qa|grep javapython-javapackages-3.4.1-5.el7.noarchjavapackages-tools-3.4.1-5.el7.noarchjava-1.7.0-openjdk-headless-1.7.0.51
2021-09-01 14:18:42
2295
1
原创 JVM学习笔记
文章目录Java虚拟机的内存模型测试内存溢出栈溢出测试线上实际调优案例Java虚拟机的内存模型Java 虚拟机栈在HotSpot虚拟机中虚拟机栈和本地方法栈是一样的不进行区分,我们通常所说的栈一般情况下指的是Java虚拟机栈Java虚拟机栈 是线程私有的 描述的是Java方法执行的线程内存模型:每个方法被执行的时候,Java虚拟机都会同步创建一个栈帧(Stack Frame)用于存储局部变量、操作数栈、动态链接、方法出口等信息。每一个方法被调用直至执行完毕的过程,就对应着一个栈帧在虚拟机中从入栈
2021-08-07 16:58:09
89
转载 Disable Registration of a Servlet or Filter
问题I have a Spring Boot WebMVC application, and a bean that inherits from AbstractPreAuthenticatedProcessingFilter which I am explicitly adding to a specific spot in the Spring Security filter chain. My Spring Security configuration looks like this:<ht
2021-06-07 21:16:17
96
原创 Git 常用操作
Git还原某个特定的文件到之前的版本在命令行中输入 git log <filename> 得到该文件的 commit 历史。复制需要回退版本的hash,在此假设我们回退到 429c41a140b5110f08140304fb45a4a1a461cb90 ,则复制该序列即可checkout 对应版本。格式为 git checkout <hash> <filename>, 在此即为命令行中输入 git checkout d98a0f565804ba639ba
2021-05-17 11:06:27
175
原创 spring boot layer
The layers order is important as it determines how likely previous layers can be cached when part of the application changes.the default order is dependencies, spring-boot-loader, snapshot-dependencies, application. Content that is least ike to change shou
2021-05-10 13:35:15
395
原创 Mac 系统使用问题
终端中配置的变量不生效最近将系统升级到了 Catalina,然后根据建议同时更换了shell。然后,这两天发现在终端中使用 mvn 命令时原来定义的一些变量不生效。于是查了查,原来mac中安装了好几个 shell,一般Linux中使用的是 bash,使用 cat /etc/shells 可以查看Mac上已经安装的 shell,这里我也是才发现安装了这么多 shell。这里可以看出当前使用的是 zsh,而在使用 bash 终端的时候,Mac 加载环境变量的顺序是:/etc/profile/etc
2021-05-08 22:37:31
176
原创 Application Events and Listeners
Application Events and ListenersIn addition to the usual Spring Framework events, such as ContextRefreshedEvent, a SpriingApplication sends some additional application events.Application events are sent in the following order, as your application runs:
2021-05-08 15:34:03
149
1
原创 JavaMail
最近做了一个邮件发送功能,需要将查出的数据以邮件中附件的形式发送出去。记录下相关知识。同时相应的工具包将在 KUTILS 的下一个版本 kutils-0.0.6 中进行发布,引用地址<dependency> <groupId>net.offecka</groupId> <artifactId>kutils</artifactId> <version>0.0.6</version></dependency
2021-04-06 18:38:18
143
原创 MyBatis 源码解读(五)类型别名
typeAliasesElement 加载类型别名解析配置的别名XMLConfigBuilder.typeAliasesElement(root.evalNode(“typeAliases”));创建 User 类,用于辅助测试package com.tky.ibatis.model;// ......public class User implements Serializable{ private Long id ; private Long version ;
2021-03-17 14:21:29
202
1
原创 SpringBoot 自定义RequestMappingHandlerMapping
SpringBoot 默认的 RequestMappingHandlerMapping 实现会扫描项目目录下的所有带有 @Controller 和 @RequestMapping 类进行处理.RequestMappingHandlerMapping.isHandler@Overrideprotected boolean isHandler(Class<?> beanType) { return (AnnotatedElementUtils.hasAnnotation(beanType
2021-03-12 12:05:45
2877
原创 JDBC连接数据库获取表字段的注释信息
最近在编写KUTILS的时候,需要抓取数据库的字段的数据类型、字段名称、字段注释,字段长度,字段精度等信息,这里记录下一些经常会使用到的信息。public class ConnectionUtil { private static ThreadLocal<Connection> holder = new ThreadLocal<Connection>(); public static Connection getConnection(DataSourceInfo data
2021-03-09 23:06:26
2477
1
原创 MyBatis 源码解读(四)引入日志工具
首先我们看一下配置的settings中的日志配置选项是如何被加载的。loadCustomLogImpl(settings) 是加载我们配置的日志系统的过程private void loadCustomLogImpl(Properties props) { Class<? extends Log> logImpl = resolveClass(props.getProperty("logImpl")); configuration.setLogImpl(logImpl);}通过r
2021-03-05 15:47:05
310
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人