Java
文章平均质量分 70
CopyLower
毕业后,参加工作先是制图行业,后转行从事Java软件开发,在华为、平安等公司工作过,有前端/后台的开发经验。
展开
-
JVM的学习
【代码】JVM的学习。原创 2024-04-20 22:06:48 · 230 阅读 · 0 评论 -
中间件学习
答:常见的处理办法就是采用看门狗机制对分布式锁进行续命,具体步骤如下所示: 当前线程加锁成功后,假设设置默认过期时间为30秒,会注册一个定时任务监听这个锁,每隔30/3=10 秒就去查看这个锁,如果还持有锁,就对锁的过期时间继续续命30秒,如果没持有锁,就取消定时任务。通过对redis数据分片,实现redis的分布式存储,cluser集群采用去中心化的思想,节点之间的通信采用gossip二进制协议,master节点负责请求的读写,slave 节点不参与请求的处理,只作为master的备份。原创 2024-03-25 14:13:08 · 756 阅读 · 0 评论 -
手写JDK Proxy实现InvocationHandler的Invoker
以上这个过程就叫字节码重组。JDK中有一个规范,在ClassPath下只要是$开头的class。2、JDKProxy类重新生成一个新的类、同时新的类要实现被代理类所有实现的所有的接。3、动态生成Java代码,把新加的业务逻辑方法由一定的逻辑代码去调用(在代码中体。1、拿到被代理对象的引用,并且获取到它的所有的接口,反射获取。4、编译新生成的Java代码.class。5、再重新加载到JVM中运行。文件一般都是自动生成的。原创 2024-03-21 16:19:27 · 269 阅读 · 0 评论 -
Spring Cloud学习
Spring cloud 流应用程序启动器是基于 Spring Boot 的 Spring 集成应用程序,提供与外部系统的集成。Spring cloud Task,一个生命周期短暂的微服务框架,用于快速构建执行有限数据处理的应用程序。Spring cloud 流应用程序启动器是基于 Spring Boot 的 Spring 集成应用程序,提供与外部系统的集成。Spring cloud Task,一个生命周期短暂的微服务框架,用于快速构建执行有限数据处理的应用程序。原创 2024-02-25 20:01:33 · 376 阅读 · 0 评论 -
微服务学习
SwaggerAPI 管理工具。原创 2024-02-23 23:57:19 · 524 阅读 · 0 评论 -
Java基础学习
RuntimeException 是那些可能在Java 虚拟机正常运行期间抛出的异常的超类。如果出现RuntimeException,那么一定是程序员的错误。如果出现了这样的错误,除了告知用户,剩下的就是尽力使程序安全的终止。2. Exception 又 有 两 个 分 支 , 一个是运行时异常 RuntimeException , 一 个 是CheckedException。检查异常CheckedException:一般是外部错误,这种异常都发生在编译阶段,Java 编译器会强。原创 2024-02-23 18:20:45 · 1271 阅读 · 0 评论 -
Java多线程并发学习
AQS只是一个框架,具体资源的获取/释放方式交由自定义同步器去实现,AQS这里只定义了一个接口,具体资源的获取交由自定义同步器去实现了(通过state的get/set/CAS)之所以没有定义成abstract,是因为独占模式下只用实现 tryAcquire-tryRelease,而共享模式下只用实现tryAcquireShared-tryReleaseShared。正数表示成功,且有剩余资源。尝试获取资源,成功则返回true,失败则返回false。尝试释放资源,成功则返回true,失败则返回false。原创 2024-02-23 16:04:20 · 1144 阅读 · 0 评论 -
线程安全性的原理分析学习
由于CPU高速缓存的出现使得 如果多个cpu同时缓存了相同的共享数据时,可能存在可见性问题。也就是CPU0修改了自己本地缓存的值对于 CPU1 不可见。不可见导致的后果是 CPU1 后续在对该数据进行写入操作时,是使用的脏数据。使得数据最终的结果不可预测。希望想在代码里面去模拟一下可见性的问题,实际上,这种情况很难模拟。因为我们无法让某个线程指定某个特定CPU,这是系统底层的算法, JVM 应该也是没法控制的。原创 2024-02-17 07:37:03 · 700 阅读 · 0 评论 -
多线程的基本原理学习
在普通实例对象中,oopDesc的定义包含两个成员,分别_mark 表示对象标记、属于markOop类型,也就是接下来要讲解的Mark World,它记录了对象和锁有关的信息 _metadata 表示类元信息,类元信息存储的是对象指向它的类元数据(Klass)的首地址,其中 Klass 表示普通指针、 _compressed_klass 表示压缩类指针。偏向锁的场景太过于理想化,更多的时候是 Thread#2 也会尝试进入临界区, 如果 Thread#2 也进入临界区但是级锁的方式来获取锁。原创 2024-02-16 18:38:18 · 917 阅读 · 0 评论 -
Spring AOP学习
【代码】Spring AOP学习。原创 2024-01-19 22:16:41 · 483 阅读 · 0 评论 -
Spring 核心之 IOC 容器学习二
【代码】Spring 核心之 IOC 容器学习二。原创 2024-01-18 22:41:29 · 474 阅读 · 0 评论 -
Spring 核心之 IOC 容器学习一
IOC 与 DIIOC(Inversion of Control)控制反转:所谓控制反转,就是把原先我们代码里面需要实现的对象创建、依赖的代码,反转给容器来帮忙实现。那么必然的我们需要创建一个容器,同时需要一种描述来让容器知道需要创建的对象与对象的关系。这个描述最具体表现就是我们所看到的配置文件。DI(Dependency Injection)依赖注入:就是指对象是被动接受依赖类而不是自己主动去找,换句话说就是指对象不是从容器中查找它依赖的类,而是在容器实例化对象的时候主动将它依赖的类注入给它。1、对象原创 2024-01-18 22:27:31 · 1213 阅读 · 0 评论 -
Spring框架的背景学习
从 spring-core 入手,其次是 spring-beans 和 spring-aop,随后是 spring-context,再其次是 spring-tx 和 spring-orm,最后是 spring-web 和其他部分。组成 Spring 框架的每个模块集合或者模块都可以单独存在,也可以一个或多个模块联合实现。原创 2024-01-15 20:29:28 · 501 阅读 · 0 评论 -
Tomcat性能优化学习
如果将此值设置为一 个较大值,则新生代对象会在 Survivor 区进行多次复制,这样可以增加对象在新生代的存活时间,增加在新生代即被回收的概率,减少Full GC的频率,这样做可以在某种程度上提高服务稳定性。-XX:+UseBiasedLocking:启用一个优化了的线程锁,我们知道在我们的appserver,每个http请求就是一个线程,有的请求短有的请求长,就会有请求排队的现象,甚至还会出现线程阻塞,这个优化了的线程锁使得你的appserver内对线程处理自动进行最优调配。原创 2024-01-12 22:38:11 · 965 阅读 · 0 评论 -
Tomcat基础升华学习
使用同样的方式看tomcat7和tomcat8.5,你会发现tomcat7默认使用的是BIO,tomcat8.5默认使用的是NIO。(3)maxThreads:最大工作线程数,也就是用来处理request请求的,默认是200,如果自己配了executor,并且和。官网:https://tomcat.apache.org/tomcat-8.0-doc/config/http.html。可能在高并发的情况下,创建的Socket过多,文件句柄不够用了,可以关闭无用的句柄,如果都有用,可以增加文件。原创 2024-01-12 22:28:10 · 1229 阅读 · 0 评论 -
ConcurrentHashMap的原理分析学习
为什么要引入红黑树呢?在正常情况下,key hash 之后如果能够很均匀的分散在数组中,那么 table 数组中的每个队列的长度主要为 0 或者 1.但是实际情况下,还是会存在一些队列长度过长的情况。因此对于队列长度超过 8 的列表,JDK1.8 采用了红黑树的结构,那么查询的时间复杂度就会降低到O(logN),可以提升查找的性能;这个结构和 JDK1.8 版本中的 Hashmap 的实现结构基本一致,但是为了保证线程安全性,ConcurrentHashMap 的实现会稍微复杂一下。1. 高并发下的扩容。原创 2024-01-07 17:57:06 · 456 阅读 · 0 评论 -
ReentrantLock底层原理学习二
以 ReentrantLock 作为切入点,来看看在这个场景中是如何使用 AQS 来实现线程的同步的。原创 2024-01-07 16:38:54 · 459 阅读 · 0 评论 -
ReentrantLock底层原理学习一
Java.util.concurrent 是在并发编程中比较常用的工具类,里面包含很多用来在并发场景中使用的组件。比如线程池、阻塞队列、计时器、同步器、并发集合等等。并发包的作者是大名鼎鼎的 Doug Lea。我们在接下来的课程中,回去剖析一些经典的比较常用的组件的设计思想在 Lock 接口出现之前,Java 中的应用程序对于多线程的并发安全处理只能基于synchronized 关键字来解决。但是 synchronized 在有些场景中会存在一些短板,也就是它并不适合于所有的并发场景。原创 2024-01-06 17:26:02 · 434 阅读 · 0 评论 -
Java基础面试题
输出结果表明i1和i2指向的是同一个对象,而i3和i4指向的是不同的对象。原创 2023-12-29 22:42:51 · 295 阅读 · 0 评论 -
Netty学习
Netty为每个Channel分配了一个EventLoop,用于处理用户连接请求,对用户请求的处理等所有事件,EventLoop本身只是一个线程启动,在其生命周期内只会绑定一个线程,让该线程处理一个Channel的所有IO事件。EventLoop定义了Netty的核心抽象,用来处理连接的生命周期中所发生的事件,在内部,将会为每个Channel分配一个EventLoop。是一种同步非阻塞的I/O模型,对应java.nio包,提供了Channel、Selector、Buffer等抽象。原创 2023-12-29 22:42:05 · 449 阅读 · 0 评论 -
单例模式学习
它的工作过程是:如果一个类加载器收到了类加载的请求,它首先不会去加载这个类,而是把这个请求委派给父类加载器去完成,每一个层次的类加载器都是如此,因此所有的加载请求最终都应该传送到顶层的启动类加载器中,只有当父加载器反馈自己无法完成这个加载请求(他的搜索范围中,没有找到这个类),子加载器才会去尝试加载。如果是 1-3-2 执行的顺序,当执行完 3 、2未执行之前,被切换到 B 线程,此时 instance 已经非空,B 会直接取走 instance,在使用时就会出错。不过,这样的实现方式不支持延迟加载实例。原创 2023-12-24 21:22:17 · 1167 阅读 · 0 评论 -
Spring中用到的设计模式
2、工厂方法模式(Fatory Method Pattern)是指定义一个创建对象的接口,但让实现这个接口的类来决定实例化哪个类,工厂方法让类的实例化推迟到子类中进行。1、简单工厂模型,是指由一个工厂对象决定创建哪一种产品类的实例,工厂类负责创建的对象较少,客户端只需要传入工厂类的参数,对于如何创建对象的逻辑不需要关心。工厂类的职责相对过重,增加新的产品时需要修改工厂类的判断逻辑,违背开闭原则,不易于扩展过于复杂的产品结构。规定了所有可能被创建的产品集合,产品族中扩展新的产品困难,需要修改抽象工厂的接口。原创 2023-12-20 09:02:06 · 1003 阅读 · 0 评论 -
软件架构设计的七大原则
这样的设计,可以降低类的复杂度,提高类的可 读 性 , 提 高 系 统 的 可 维 护 性 , 降 低 变 更 引 起 的 风 险。里氏替换原则(Liskov Substitution Principle,LSP)是指如果对每一个类型为 T1 的对象 o1,都有类型为 T2 的对象 o2,使得以 T1 定义的所有程序 P 在所有的对象 o1 都替换成o2 时,程序 P 的行为没有发生变化,那么类型 T2 是类型 T1 的子类型。所以,对于抽象,对业务模型的理解是非常重要的。降低需求变更时引入的风险。原创 2023-12-19 00:02:47 · 368 阅读 · 0 评论 -
Semaphore学习一
可以把它简单的理解成我们停车场入口立着的那个显示屏,每有一辆车进入停车场显示屏就会显示剩余车位减1,每有一辆车从停车场出去,显示屏上显示的剩余车辆就会加1,当显示屏上的剩余车位为0时,停车场入口的栏杆就不会再打开,车辆就无法进入停车场了,直到有一辆车从停车场出去为止。1、当前线程会尝试去同步队列获取一个令牌,获取令牌的过程就是使用原子的操作去修改同步队列的state,获取一个令牌则修改为state=state-1。表示释放一个许可,那么线程许可数量相应增加,释放一个令牌,唤醒一个获取令牌不成功的阻塞线程。原创 2023-12-19 00:01:59 · 817 阅读 · 0 评论 -
CyclicBarrier学习一
CyclicBarrier 作用是让一组线程相互等待,当达到一个共同点时,所有之前等待的线程再继续执行,且 CyclicBarrier 功能可重复使用。最终执行结果,是最后到达屏障的最先执行,其次才是之前到达屏障阻塞的所有线程,其他线程被释放的顺序,也不一定是按照await方法的调用顺序来定的。CyclicBarrier 可以 让一组线程到达一个屏障时被阻塞,直到最后一个线程到达屏障时,屏障才会开门,所有被屏障拦截的线程才会释放。4、被唤醒过后会进行锁的获取,如果锁获取失败,会进入 lock 的阻塞队列;原创 2023-12-18 08:49:50 · 1272 阅读 · 0 评论 -
CountDownLatch学习一
这是AQS里面的方法,arg在这里调用的是1,表示countDown是否减少到了0,如果到0了,那说明满足了要求,返回1,不再等待,如果没有达到0,说明还有线程未执行,必须要等到所有的线程,执行结束才可以,返回-1,此时小于0,执行doAcquireSharedInterruptibly方法。同样是等待其他线程都完成了,才可以进行下一步操作,我们再举一个例子,在打王者的时候,在开局前所有人都必须要加载到100%才可以进入。如果当前还有线程未执行而且过了超时时间,那就直接执行等待线程就好,不再等了。原创 2023-12-18 08:49:15 · 1629 阅读 · 0 评论 -
Java面试题一
一、HashMap和TreeMap1、HashMap主要用来存放键值对(K-V),数据是无序的2、JDK8开始,底层由数组+链表+红黑树的数据结构来实现3、当发生哈希冲突时,通过拉链法进行处理,当链表长度大于阈值(默认为8)时,将链表转化为红黑树,以减少搜索时间...原创 2023-12-17 16:48:10 · 1007 阅读 · 0 评论 -
Java图片杀毒、格式校验、压缩
记录下图片工具类中杀毒、格式校验、压缩相关功能。原创 2023-09-05 16:54:23 · 262 阅读 · 0 评论 -
Redis哨兵模式
执行命令之后,成功则会显示如下图,也可以直接点击redis文件中的 “redis-server.exe”来启动。启动redis实例成功之后,可以在命令窗口或者在redis文件中点击“redis-cli.exe”来运行客户端。然后修改copy的两份redis中的redis.windows.conf端口号修改成对应端口号,并设置为从节点。然后再运行从节点的客户端,并执行查看数据命令,可以发现从主机中的数据已经同步推送到了从机上。在当前redis文件中右键,点击弹出框中 “在终端中打开”,在里面输入启动命令。原创 2023-08-29 16:24:31 · 141 阅读 · 0 评论 -
Java学习
当反序列化时,程序会比较磁盘中的序列化版本号ID跟当前的类结构生成的版本号ID是否一致,如果一致则反序列化成功,否则,反序列化失败;加上版本号,有助于当我们的类结构发生了变化,依然可以之前已经序列化的对象反序列化成功。==比较的是值,比较基本的数据类型,比较的是数值,比较引用类型,比较引用指向的值(地址)分布式项目,面向服务的开发,抽取服务service,产生服务的提供者和服务的消费者两个角色。默认比较也是地址,最初定义在object上,默认实现的比较地址。接口一种标准的制定,定制系统之间对接的标准。...原创 2022-07-28 20:52:13 · 185 阅读 · 0 评论 -
JAVA语言程序设计
计算机、程序和JAVA概述一、计算机概述和编程语言一)、Java语言的发展60年代->提出对象与实例的概念,并引入了类。 1960年代由Simula 67语言引入面向对象的基本概念。Simula这一语言是Ole-Johan Dahl和Kristen Nygaard在挪威奥斯陆计算机中心为模拟环境而设计的。麻省理工PDP-1系统1963年,Ivan Sutherland的Sketchpad应用80年代:面向对象成为主导思想,事件处理式成为面向对象的内容 C++的广泛应用适应了GU原创 2022-06-22 23:42:35 · 6336 阅读 · 0 评论 -
学习Spring Cloud与微服务之路五
一、Eureka REST API原创 2020-11-04 23:36:52 · 90 阅读 · 0 评论 -
学习Spring Cloud与微服务之路四
一、编译打包1、在传统web项目在部署的时候,是编译出一个war包放到tomcat的webapps包下,而Spring Boot构建的web项目采用更加简单的内置容器方式来实现部署应用程序,只需要将应用编译成一个jar包,通过java-jar xx.jar命令就可用启动应用程序。mainClass配置的启动入口类,配置完成后可用通过maven的mvn clean package命令进行编译打包操作,编译完成后在target目录下会生成对应的jar包,部署的时候直接调用java-jar XX.jar即可原创 2020-10-06 21:47:39 · 100 阅读 · 0 评论 -
关于Spring Boot中spring-boot-starter依赖包和应用
1、spring-boot-starter是Spring Boot的核心启动器,包含了自动配置、日志和YAML。2、spring-boot-starter-amqp是通过spring-rabbit来支持AMQP协议(Advanced Message Queuing Protocol)3、spring-boot-starter-aop是支持面向方面的编程即AOP,包括spring-aop和AspectJ。4、spring-boot-starter-artemis是通过Apache Artemis支持JM原创 2020-09-26 23:21:51 · 904 阅读 · 0 评论 -
SpringBoot 之Spring Boot Starter依赖包及作用
spring-boot-starter这是Spring Boot的核心启动器,包含了自动配置、日志和YAML。spring-boot-starter-amqp通过spring-rabbit来支持AMQP协议(Advanced Message Queuing Protocol. 。spring-boot-starter-aop支持面向方面的编程即AOP,包括spring-aop和AspectJ。spring-boot-starter-artemis通过Apache Artemis支持JMS的AP原创 2023-12-21 09:38:11 · 375 阅读 · 0 评论 -
运行Spring Boot的时候报错:Web server failed to start. Port 8080 was already in use.
启动Spring boot项目的时候报错,错误如下:Description:Web server failed to start. Port 8080 was already in use.Action:Identify and stop the process that’s listening on port 8080 or configure this application to listen on another port.报错的原因是8080端口被占用了解决方案有二:一、修改端口号原创 2020-09-26 13:30:28 · 986 阅读 · 0 评论 -
学习Spring Cloud与微服务之路三
一、开发环境的准备开发环境的准备主要涉及三个方面:JDK、Maven、Spring Tools 4 for Eclipse1、JDKJDK的版本用1.8即可,具体安装请看这篇文章2、MavenMaven是用于项目构建的,具体安装请看 这篇文章3、Spring Tools 4 to Eclipse...原创 2020-09-25 23:54:42 · 3588 阅读 · 1 评论 -
学习Spring Cloud与微服务之二
1、什么是Spring CloudSpring Cloud是一系列框架的有序集合,它利用Spring Boot的开发便利性,巧妙的简化了分布式系统基础设施的开发,如服务注册、服务发现、配置中心、消息总线、负载均衡、断路器、数据监控等,这些都可以用Spring Boot的开发风格做到一键启动和部署,通俗的讲,Spring Cloud就是用于构建微服务开发和治理的框架集合2、Spring Cloud模块介绍Eureka : 服务注册中心,用于服务管理Ribbon : 基于客户端的负载均衡组件Hy原创 2020-09-25 22:35:18 · 129 阅读 · 1 评论 -
windom10系统下JDK的安装
下载jdk安装包https://www.oracle.com/technetwork/java/javase/downloads/index.html找到并点击Java SE 8点击同意协议,选择对应版本的jdk,这里选择的是 64位 windows 版本的jdk8u171双击下载好的exe文件,执行安装点击“下一步”,并记住安装位置“D:\Java\jdk1.8.0_171”一般是直接下一步即可,安装完成,点击关闭配置jdk环境变量右键计算机–>属性–>高级系统设置–&g原创 2020-09-25 19:03:54 · 157 阅读 · 0 评论 -
maven3.3.3安装以及lombok安装
前提条件:Windows下安装好jdk1.8一、maven安装步骤1解压下载地址:http://archive.apache.org/dist/maven/maven-3/3.3.3/binaries/直接解压apache-maven-3.3.3-bin.zip文件到D盘即可步骤2环境变量设置1.创建 MAVEN_HOME D:\maven\apache-maven-3.3.32.Path环境变量中增加 ;%MAVEN_HOME%\bin3.创建 M2_REPO D:\maven\m原创 2020-09-25 18:40:07 · 869 阅读 · 1 评论