![](https://img-blog.csdnimg.cn/20201014180756923.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Java
文章平均质量分 74
philpy_used
这个作者很懒,什么都没留下…
展开
-
Spring拦截器通过Stream拦截请求体后Controller无法通过@RequestBody获取的解决方案
核心:javax.servlet.http.HttpServletRequestWrapperWebMvcConfig:@Configurationpublic class WebMvcConfig implements WebMvcConfigurer { @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new MyInterc原创 2022-03-06 20:13:01 · 984 阅读 · 1 评论 -
Spring 编程式定时任务
(其实不单单事务有编程式和声明式,定时任务也有哦…)Spring 声明式定时任务大家都用的很频繁并且很熟练了吧,通过@EnableScheduling和@Schedule(cron)注解即可实现。虽然声明式定时任务配合上强大的cron表达式已经可以满足我们的大多数需求了,但是如果说在程序运行期间我们需要更改定时任务的执行频率,通过编程式@Schedule注解是不容易去实现的。为此Spring为我们提供了一个接口SchedulingConfigurer可以让定时任务在运行时更改执行频率,我们只需要一个实原创 2022-02-17 17:34:04 · 572 阅读 · 0 评论 -
JVM虚拟机 字节码指令表
字节码助记符指令含义0x00nopNone0x01aconst_null将null推送至栈顶0x02iconst_m1将int型-1推送至栈顶0x03iconst_0将int型0推送至栈顶0x04iconst_1将int型1推送至栈顶0x05iconst_2将int型2推送至栈顶0x06iconst_3将int型3推送至栈顶0x07iconst_4将int型4推送至栈顶0x08iconst_5将int型5推送...原创 2022-01-25 17:44:35 · 642 阅读 · 0 评论 -
Java并发编程之 final
final是Java中的一个关键字,final可用于修饰类、方法、参数和变量(包括实例变量和类变量)。final修饰类final修饰的类具有不可继承性,也就是如果一个类是final类型的,则这个类不允许有子类。final修饰方法final修饰的方法具有不可变性,也就是说final的方法不允许在子类中被重写(@Override)。final修饰参数如果参数用final修饰,那么在方法中我们不能对这个final参数进行修改。final修饰的基本数据类型的参数不可以修改其值:final修饰的原创 2022-01-18 15:20:11 · 344 阅读 · 0 评论 -
Java并发编程之 ThreadLocal
多线程访问同一个共享变量的时候容易出现并发问题,特别是多个线程对一个变量进行写入的时候,为了保证线程安全,一般使用者在访问共享变量的时候需要进行额外的同步措施才能保证线程安全性。ThreadLocal是除了加锁这种同步方式之外的另一种保证一种规避多线程访问出现线程不安全的方法,当我们在创建一个变量后,如果每个线程对其进行访问的时候访问的都是线程自己的变量这样就不会存在线程不安全问题。ThreadLocal是JDK包提供的,它提供线程本地变量,如果创建一个ThreadLocal变量,那么访问这个变量的每个线原创 2021-10-06 16:09:28 · 310 阅读 · 1 评论 -
Java并发编程之 ConcurrentHashMap
JDK1.7——分段锁首先将数据分成一段一段地存储,然后给每一段数据配一把锁,当一个线程占用锁访问其中一个段数据的时候,其他段的数据也能被其他线程访问。ConcurrentHashMap是由Segment数组结构和HashEntry数组结构组成。Segment是一种可重入锁(ReentrantLock),在ConcurrentHashMap里扮演锁的角色;HashEntry则用于存储键值对数据。一个ConcurrentHashMap里包含一个Segment数组,Segment的结构和HashMap类原创 2021-10-05 19:23:53 · 495 阅读 · 0 评论 -
Java并发编程之 Excutor
在Java中,使用线程来异步执行任务。Java线程的创建与销毁需要一定的开销,如果我们为每一个任务创建一个新线程来执行,这些线程的创建与销毁将消耗大量的计算资源。同时,为每一个任务创建一个新线程来执行,这种策略可能会使处于高负荷状态的应用最终崩溃。Java的线程既是工作单元,也是执行机制。从JDK 5开始,把工作单元与执行机制分离开来。工作单元包括Runnable和Callable,而执行机制由Executor框架提供。在HotSpot VM的线程模型中,Java线程(java.lang.Thread)原创 2021-10-04 10:26:59 · 728 阅读 · 0 评论 -
Java并发编程之 locks
锁是用来控制多个线程访问共享资源的方式,一般来说,一个锁能够防止多个线程同时访问共享资源(但是有些锁可以允许多个线程并发的访问共享资源,比如读写锁)。在Lock接口出现之前,Java程序是靠synchronized关键字实现锁功能的,而Java SE 5之后,并发包中新增了Lock接口(以及相关实现类)用来实现锁功能,它提供了与synchronized关键字类似的同步功能,只是在使用时需要显式地获取和释放锁。虽然它缺少了(通过synchronized块或者方法所提供的)隐式获取释放锁的便捷性,但是却拥有了锁原创 2021-10-02 08:57:49 · 495 阅读 · 0 评论 -
Java并发编程之 AQS
队列同步器AbstractQueuedSynchronizer(AQS),是用来构建锁或者其他同步组件的基础框架(ReentrantLock、CountDownLatch、Semaphore…),它使用了一个int成员变量表示同步状态(private volatile int state;),通过内置的FIFO队列来完成资源获取线程的排队工作,并发包的作者(Doug Lea)期望它能够成为实现大部分同步需求的基础。state用关键字volatile修饰,代表着该共享资源的状态一更改就能被所有线程可见,而A原创 2021-09-30 16:51:04 · 423 阅读 · 0 评论 -
Java并发编程之 atomic
当程序更新一个变量时,如果多线程同时更新这个变量,可能得到期望之外的值,比如变量i=1,A线程更新i+1,B线程也更新i+1,经过两个线程操作之后可能i不等于3,而是等于2。因为A和B线程在更新变量i的时候拿到的i都是1,这就是线程不安全的更新操作:public class Main { int i = 0; void inc() { this.i++; } public static void main(String[] args) throws In原创 2021-09-29 16:13:41 · 799 阅读 · 0 评论 -
Java并发编程之 CAS
乐观锁乐观锁假设数据一般情况不会造成冲突,所以在数据进行提交更新的时候,才会正式对数据的冲突与否进行检测,如果冲突,则返回给用户异常信息,让用户决定如何去做。乐观锁适用于读多写少的场景,这样可以提高程序的吞吐量。CAS是乐观锁。CASCAS即比较并交换(compare and swap)。是解决多线程并行情况下使用锁造成性能损耗的一种机制,CAS 操作包含三个操作数——内存位置(V)、预期原值(A)和新值(B)。如果内存位置的值(V)与预期原值(A)相匹配,那么处理器会自动将该位置值更新为新值(B)。原创 2021-09-24 10:03:27 · 389 阅读 · 0 评论 -
Java并发编程之 synchronized
Java中的每一个对象都可以作为锁。具体表现为以下3种形式:对于普通同步方法,锁是当前实例对象对于静态同步方法,锁是当前类的Class对象对于同步代码块,锁是synchonized括号里配置的对象都对于同步代码块而言,JVM是使用monitorenter和monitorexit实现的:monitorenter指令是在编译后插入到同步代码块的开始位置,而monitorexit是插入到方法结束处和异常处,JVM要保证每个monitorenter必须有对应的monitorexit与之配对。任何对象原创 2021-09-22 20:39:16 · 703 阅读 · 1 评论 -
Java并发编程之 volatile
并发编程三大特性原子性、有序性、可见性volatile可以保证有序性和可见性,不能保证原子性happens-before原则在JMM中,如果一个操作执行的结果需要对另一个操作可见,那么这两个操作之间必须要存在happens-before关系。这里提到的两个操作既可以是在一个线程之内,也可以是在不同线程之间。程序顺序规则:一个线程中,按照程序顺序,前面的操作 happens-before 于后续的任意操作监视器锁规则:对一个锁的解锁,happens-before于随后对这个锁的加锁volati原创 2021-09-21 16:31:20 · 455 阅读 · 0 评论 -
Java并发编程之 JMM内存模型
硬件内存架构现代计算机的基本硬件架构如图所示:多CPU:一个现代计算机通常由两个或者多个CPU。其中一些CPU还有多核。从这一点可以看出,在一个有两个或者多个CPU的现代计算机上同时运行多个线程是可能的。每个CPU在某一时刻运行一个线程是没有问题的。这意味着,如果你的Java程序是多线程的,在你的Java程序中每个CPU上一个线程可能同时(并发)执行。CPU寄存器(CPU Registers):每个CPU都包含一系列的寄存器,它们是CPU内内存的基础。CPU在寄存器上执行操作的速度远大于在主存上执原创 2021-09-21 08:51:36 · 395 阅读 · 0 评论 -
Spring 声明式事务
项目结构:表结构:基于xml的声明式事务配置IAccountDao.java:package tx.dao;import java.math.BigDecimal;public interface IAccountDao { void add(String name, BigDecimal money); void sub(String name, BigDecimal money);}AccountDaoImpl.java:package tx.servi原创 2021-09-20 20:11:39 · 712 阅读 · 0 评论 -
JVM初探
一个Java文件的执行流程粗略地讲就是这样:1、javac编译器2、类装载子系统原创 2021-09-16 16:53:55 · 333 阅读 · 0 评论 -
JVM初探之 字节码执行引擎
字节码执行引擎是Java虚拟机核心的组成部分之一。“虚拟机”是一个相对于“物理机”的概念,这两种机器都有代码执行能力,其区别是物理机的执行引擎是直接建立在处理器、缓存、指令集和操作系统层面上的,而虚拟机的执行引擎则是由软件自行实现的,因此可以不受物理条件制约地定制指令集与执行引擎的结构体系,能够执行那些不被硬件直接支持的指令集格式。在不同的虚拟机实现中,执行引擎在执行字节码的时候,通常会有解释执行(通过解释器执行)和编译执行(通过即时编译器产生本地代码执行)两种选择,也可能两者兼备,还可能会有同时包含几个原创 2021-09-16 11:52:27 · 501 阅读 · 0 评论 -
JVM初探之 堆和垃圾回收
对于Java应用程序来说,Java堆(Java Heap)是虚拟机所管理的内存中最大的一块。Java堆是被所有线程共享的一块内存区域,在虚拟机启动时创建。此内存区域的唯一目的就是存放对象实例,Java世界里“几乎”所有的对象实例都在这里分配内存(The heap is the runtime data area from which memory for all class instances and arrays is allocated)。Java堆既可以被实现成固定大小的,也可以是可扩展的,不过原创 2021-09-15 17:41:28 · 478 阅读 · 0 评论 -
JVM初探之 方法区
方法区是一个规范,永久代、元空间是它的具体实现jdk1.8以前,方法区的实现叫永久代,是存储在堆上的。字符串常量池、静态变量、类型信息等是存储在永久代的jdk1.8及以后,方法区的实现叫元空间,是存储在本地内存上的。jdk1.7时,常量池、静态变量被移动到了堆内存,到了jdk1.8,永久代彻底不存在了,变成了元空间...原创 2021-09-14 17:58:23 · 374 阅读 · 0 评论 -
JVM初探之 Java虚拟机栈
Java虚拟机栈也是线程私有的,它的生命周期与线程相同。虚拟机栈描述的是Java方法执行的线程内存模型:每个方法被执行的时候,Java虚拟机都会同步创建一个栈帧(Stack Frame)用于存储局部变量表、操作数栈、动态连接、方法出口等信息。每一个方法被调用直至执行完毕的过程,就对应着一个栈帧在虚拟机栈中从入栈到出栈的过程。如果线程请求的栈深度大于虚拟机所允许的深度,将抛出StackOverflowError异常;如果Java虚拟机栈容量可以动态扩展,当栈扩展时无法申请到足够的内存会抛出OutOfMemo原创 2021-09-14 10:43:23 · 335 阅读 · 0 评论 -
JVM初探之 类装载子系统(类加载器)与双亲委派机制
java的类加载步骤大概分为三步:1、加载加载阶段的主要任务是将.class文件中的类转化为java.lang.Class对象,具体步骤为:通过一个类的全限定类名获取其二进制字节流将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构在堆中创建一个该类的java.lang.Class对象,作为方法区中这个类的各种数据的访问入口2、连接2.1、验证验证的主要目的是确保被加载的类的正确性。包括:文件格式的验证元数据的验证字节码的验证符号引用的验证验证阶段虽然重要,但是也可原创 2021-09-12 19:59:07 · 392 阅读 · 0 评论 -
JVM初探之 javac编译器
javac编译器的编译过程大概分为三步:1、解析与填充符号表1.1、词法分析1.2、语法分析1.3、填充符号表2、注解处理器3、语义分析与字节码生成3.1、标记检查3.2、数据及控制流分析3.3、解语法糖3.4、字节码生成1、解析与填充符号表1.1、词法分析将源代码的字符流转变为标记(Token)集合,单个字符是程序编写时的最小元素,而单个Token是程序编译时的最小元素。关键字、变量名、字面量、运算符都可以看作是Token。1.2、语法分析根据词法分析产生的Token生成一个抽象语法树(Abs.原创 2021-09-09 10:38:49 · 479 阅读 · 0 评论 -
IDEA Scanner 无法在 Junit 控制台中进行输入(This view is read-only)的解决方案
解决方案在IDEA的安装目录下的/bin目录下找到文件idea64.exe.vmoptions,在文件末尾添加一行:-Deditable.java.test.console=true在IDEA中Help -> Edit Custom VM Options ...中也添加上这一行:-Deditable.java.test.console=true重启IDEA即可...原创 2021-08-27 17:59:08 · 4643 阅读 · 5 评论 -
JSP 中 <%%> 和 <%!%>的区别
先来看一道题,猜猜它的输出:<%@ page contentType="text/html;charset=UTF-8" language="java" %><html><head> <title>Title</title></head><body><% int x=5; %><%! int x=7; %><%! int getX(){return x;}%>&l原创 2021-08-25 21:59:50 · 5047 阅读 · 1 评论 -
IDEA2021.2 解决双击shift弹出全局搜索窗口问题
之前修改注册表的方法已经不管用了,连ide.suppress.double.click.handler那个选项都没了…新的解决方法:原创 2021-08-24 09:30:34 · 1825 阅读 · 12 评论 -
基本数据结构之栈、队列及其数组实现
栈栈是一种“先进后出”的数据结构用数组实现栈:接口IStack:public interface IStack { /** * 元素入栈(压栈) * * @param o * @return */ boolean push(Object o) throws Exception; /** * 元素出栈(弹栈) * * @return */ Object pop() throws原创 2021-07-27 19:47:29 · 652 阅读 · 0 评论 -
Spring の HelloWorld
Maven创建项目mvn archetype:generate -DgroupId=com.philpy -DartifactId=springExample -DarchetypeArtifactId=maven-archetype-quickstart新建的Spring项目目录结构为:配置pom.xmlpom.xml添加jdk版本配置:<properties> <java.version>11</java.version> <ma原创 2021-07-22 22:20:29 · 276 阅读 · 0 评论 -
Jsch 执行jps命令没有结果 - 解决方案
ChannelExec exec = (ChannelExec)session.openChannel("exec");执行jps命令时:exec.setCommand("jps");/* ... */不会输出结果因为jps不是虚拟机内置的命令,而是java提供的一个显示当前所有java进程pid的命令,所以需要用source命令将java的环境变量以及bash"刷"一遍:exec.setCommand("source /etc/profile;source ~/.bash_profile;原创 2021-05-23 21:01:10 · 912 阅读 · 0 评论 -
Java - 基础 & JUC 多线程
基础多线程1、程序 · 进程 · 线程程序是指令和数据的有序集合,其本身没有任何运行的含义,是一个静态的概念进程是程序的一次执行过程,是一个动态的概念;进程是系统资源分配的单位线程是CPU调度和执行的单位,是一个独立的执行路径;一个进程可以包含多个线程,且一个进程中至少应有一个线程,不然没有存在的意义在程序运行时,即使没有自己创建线程,后台也会有线程在跑,如main主线程、gc垃圾回收线程等主线程main()是系统的入口,用于执行程序在一个进程中,如果开辟了多个线程,线程的运原创 2021-05-13 22:18:31 · 237 阅读 · 2 评论 -
HBase JAVA API 操作
文章目录Maven `pom.xml` 添加依赖创建表添加数据查询数据删除数据删除表Maven pom.xml 添加依赖<dependency> <groupId>org.apache.hbase</groupId> <artifactId>hbase-client</artifactId> <version>1.2.6.1</version></dependency>创建表i原创 2021-05-12 21:23:59 · 488 阅读 · 2 评论 -
单例模式与反射的攻防之【 道高一尺,魔高一丈 】
文章目录饿汉模式没有保护的饿汉模式(可以被反射破坏)反射破坏普通饿汉模式带有保护的饿汉模式(构造函数加锁防反射)反射尝试破坏带有保护的饿汉模式懒汉模式基本的懒汉模式(线程不安全)基本的懒汉模式(线程安全)synchronizedReentrantLock双检锁(DCL)懒汉模式反射破坏带有保护的懒汉模式(构造函数加锁)反射破坏带有保护的懒汉模式(构造函数加锁 + 信号灯保护机制)反射破坏带有保护的懒汉模式(构造函数加锁 + 计数器保护机制)静态内部类静态内部类单例反射破坏静态内部类单例:枚举枚举实现单例模式原创 2021-05-08 10:23:01 · 230 阅读 · 1 评论 -
Java操作Kafka
pom.xml引入依赖<dependencies> <!-- https://mvnrepository.com/artifact/org.apache.kafka/kafka-clients --> <dependency> <groupId>org.apache.kafka</groupId> <artifactId>kafka-clients</artifactId>原创 2021-04-24 10:02:13 · 151 阅读 · 0 评论 -
Springboot自动配置原理初探
https://www.processon.com/view/link/5dd13689e4b094d785afdb04原创 2021-03-23 10:57:46 · 90 阅读 · 0 评论 -
ZooKeeper JAVA API 操作
Mavenpom.xml添加依赖<dependency> <groupId>org.apache.zookeeper</groupId> <artifactId>zookeeper</artifactId> <version>3.4.14</version></dependency>创建节点package com.sleepyyoung;import org.apache.z原创 2021-03-22 22:06:14 · 225 阅读 · 0 评论 -
MapReduce JAVA API 操作
Mavenpom.xml添加依赖<dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-client</artifactId> <version>3.3.0</version></dependency>合并去重对input文件夹下的file1.txt和file2.txt进行合并去重package原创 2021-03-19 20:24:16 · 585 阅读 · 0 评论 -
SSM框架整合思路
文章目录一、新建数据库表二、新建Maven项目三、配置`pom.xml`添加依赖配置静态资源导出问题编码问题四、整合Mybatis1、为数据库表创建实体类编写实体类`Books`2、编写dao层编写接口`BooksMapper`编写映射文件`BookMapper.xml`3、在`resources`资源文件夹下新建`mybatis-config.xml`配置文件4、编写service层编写接口`BooksService`编写实现类`BooksServiceImpl`五、整合Spring1、Spring整合d原创 2021-03-13 19:13:20 · 753 阅读 · 0 评论 -
Spring AOP 三种实现方式
还是使用之前CURD的例子配置pom.xml添加AOP的依赖<!-- https://mvnrepository.com/artifact/org.aspectj/aspectjweaver --><dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.9.6&l原创 2021-03-10 22:37:25 · 154 阅读 · 0 评论 -
【代理模式】静态代理 | 动态代理
代理模式代理模式是面向对象编程中比较常见的设计模式。我们一一个新建的简单的CRUD例子为例:一个CRUD接口有四个方法(增删改查),用户去使用的时候可以调用这个接口的实现类CRUDImpl:但是一旦我们想要增加某些功能,比如说想要输出日志,那么我们就需要去修改CRUDImpl的源代码,在大项目中,这样做是有风险的。所以我们如何可以在不改变底层源代码的基础上实现功能扩展呢?这就用到了代理类:我们新建一个代理类CRUDImplProxy同样也是实现了CRUD接口,但是它的内部还有一个私有属性为CRU原创 2021-03-10 20:06:55 · 120 阅读 · 0 评论 -
HDFS JAVA API 操作
查询文件内容import org.apache.hadoop.conf.Configuration;import org.apache.hadoop.fs.FileSystem;import org.apache.hadoop.fs.Path;import org.apache.hadoop.io.IOUtils;import java.io.IOException;import java.io.InputStream;/** * 查询hdfs文件内容并输出 */public cla原创 2021-03-10 16:28:22 · 209 阅读 · 0 评论 -
Mybatis - 多对一 | 一对多 案例
新建Maven项目many2oneANDone2maney配置pom.xml配置文件<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.原创 2021-03-08 18:43:08 · 256 阅读 · 0 评论