自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(33)
  • 资源 (1)
  • 收藏
  • 关注

原创 20210721复盘

1、在大厂中用的是java8吗?还是更高版本的?基本都是8,一些老项目是72、远程面试的时候让写算法题,是线上写还是用纸写还是用面试公司开发的工具写?会有方法输入提示吗?一般都是伪代码,重点看的是思路和逻辑。如果考察细节的问题不会太大太难,用不着三方api按我的想法,有的简单的算法题,调用几个API就搞定的,不要调用第三方api,要自己实现复杂的算法题,考的就是思路,可以用伪代码把思路表达清楚即可3、面试在问项目的时候,天天crud的要咋回答比较好?我需要做些什么准备?没有好的项目精

2021-07-23 20:17:19 126

原创 在 IDEA 中的各种调试技巧,轻松定位 Bug(超级全面)

原文地址

2021-07-19 09:20:12 181

原创 Java 并发编程四篇 -(JUC、AQS 源码、ReentrantLock 源码)

并发编程已完结,章节如下:Java 并发编程上篇 -(Synchronized 原理、LockSupport 原理、ReentrantLock 原理)Java 并发编程中篇 -(JMM、CAS 原理、Volatile 原理)Java 并发编程下篇 -(线程池)Java 并发编程下篇 -(JUC、AQS 源码、ReentrantLock 源码)5、J.U.CAQS 原理1、概述全称是 AbstractQueuedSynchronizer,是阻塞式锁和相关的同步器工具的框架2、特点用

2021-07-13 11:34:42 352

原创 Java 并发编程三篇 -(线程池)

Java 并发编程下篇 -(线程池)并发编程已完结,章节如下:Java 并发编程上篇 -(Synchronized 原理、LockSupport 原理、ReentrantLock 原理)Java 并发编程中篇 -(JMM、CAS 原理、Volatile 原理)Java 并发编程下篇 -(线程池)Java 并发编程下篇 -(JUC、AQS 源码、ReentrantLock 源码)七、共享模型之工具1、线程池池化技术相比大家已经屡见不鲜了,线程池、数据库连接池、Http 连接池等等都是对这个思

2021-07-11 19:40:44 150

原创 多线程(七)ThreadLocal源码

1.简单聊一聊什么是ThreadLocal?以及它的大概用途(1) 定义 (2)作用ThreadLocal的作用是提供局部变量给线程内部使用。也就是说,它使用了一套机制保证:你new了一个变量threadLocal,在一个线程里,给threadLocal变量set一个别的线程无法访问使用的类型A的实例a,然后一段时间后,你可以从threadLocal变量中get出实例a,重点是这个threadLocal变量是可以跨线程的。同时,JDK建议你把这个threadLocal变量设置为static,因为他

2021-07-07 09:59:24 142

原创 Java 并发编程二篇 -(JMM、CAS 原理、Volatile 原理)

并发编程已完结,章节如下:Java 并发编程上篇 -(Synchronized 原理、LockSupport 原理、ReentrantLock 原理)Java 并发编程中篇 -(JMM、CAS 原理、Volatile 原理)Java 并发编程下篇 -(线程池)Java 并发编程下篇 -(JUC、AQS 源码、ReentrantLock 源码)四、共享模型之内存1、Java 内存模型(JMM)JMM 即 Java Memory Model,它定义了主存(共享内存)、工作内存(线程私有)抽象概念,

2021-07-04 17:18:06 254

原创 Java 并发编程一篇 -(Synchronized 原理、LockSupport 原理、ReentrantLock 原理)

一、基本概念1、进程与线程进程程序由指令和数据组成,但这些指令要运行,数据要读写,就必须将指令加载至 CPU,数据加载至内存。在指令运行过程中还需要用到磁盘、网络等设备。进程就是用来加载指令、管理内存、管理 IO 的。当一个程序被运行,从磁盘加载这个程序的代码至内存,这时就开启了一个进程。进程就可以视为程序的一个实例。大部分程序可以同时运行多个实例进程(例如记事本、画图、浏览器 等),也有的程序只能启动一个实例进程(例如网易云音乐、360 安全卫士等)线程一个进程之内可以分为一到多个线程

2021-06-29 21:01:29 442

原创 多线程(六)LongAdder源码

1 LongAdder结构分析1.1 为什么要有LongAdderAutomicLong底层使用了CAS操作来控制并发的。在并发量级比较小的情况下,线程冲突的概率比较小,自旋次数少。但是,高并发的情况下,多个线程同时进行自旋操作,就会出现大量失败并一直自旋的情况,这个时候AutomicLong的性能就下降了。所以引入了LongAdder,解决高并发环境下AtomicLong自旋瓶颈的问题。1.2 Longadder的结构其结构如下,当线程不存在竞争的时候,首先将值写入到base中,当线程之间有竞争时

2021-06-28 00:04:52 192

原创 Java的对象模型

原文链接对象在堆内存的布局分为三个区域:分别是对象头(Header)、实例数据(Instance Data)、对齐填充(Padding)对象头:对象头包括两部分信息分别是Mark World(_mark)和元数据(_metadata),Mark World用于存储对象运行时的数据,比如HashCode、锁状态标志、GC分代年龄等。而元数据指针用于指向方法区的中目标类的类型信息,通过元数据指针可以确定对象的具体类型。实例数据:用于存储对象中的各种类型的字段信息(包括从父类继承来的)。对齐填充

2021-06-26 22:53:53 275 2

原创 CopyOnWriterArrayList

CopyOnWriteCopyOnWrite指在“写”的时候,不是直接“写”源数据,而是把数据拷贝一份进行修改,再通过悲观锁或者乐观锁的方式写回。那为什么不直接修改,而是要拷贝一份修改呢?这是为了在“读”的时候不加锁。(以空间换时间的策略)为了提升读取的效率,修改时不在原数据上修改,而是在复制的数组上修改,改完之后再设置回来,这样做就不会阻塞读的线程CopyOnWriteArrayListCopyOnWriteArrayList的核心数据结构也是一个数组,代码如下:public class

2021-06-26 22:52:58 634

原创 多线程(五)CAS

简单的实现CAS需求有100个线程同时访问,并且每个线程发起10次请求,最后count次数应该是1000次。public class Demo { //总访问量。volatile保证多线程之间count变量的可见性 private volatile static int count = 0; /** * count ++ 操作实际上是由3步来完成!(jvm执行引擎) * 1.获取count的值,记做A : A=count * 2.将A值+1,得到B :B=A+1 *

2021-06-25 23:53:20 99

原创 JDK基础答疑

试想,当你的项目启动起来后,你在浏览器地址栏输入一个url地址,随后一个页面出现。请问,这个过程都发生了什么事情?首先访问一个网址,比如www.baidu.com,第一步是域名解析,会先从本地缓存找服务器,找不到会请求到DNS服务器去找。找到对应的ip服务器后,三次握手,与目标主机建立TCP连接动静分离处理:如果是静态资源请求,直接由Nginx处理;如果涉及到动态数据或ajax请求,通过Nginx或其他服务器请求到后端(反向代理+负载均衡)到后端服务器(通常是Tomcat)处理解析请求,用户发送请

2021-06-25 22:06:00 86

原创 多线程1~4笔记总结

并发编程三要素原子性:即一个不可再被分割的颗粒。在Java中原子性指的是一个或多个操作要么全部执行成功要么全部执行失败。有序性:程序执行的顺序按照代码的先后顺序执行。(处理器可能会对指令进行重排序)可见性:当多个线程访问同一个变量时,如果其中一个线程对其作了修改,其他线程能立即获 取到最新的值。悲观锁与乐观锁悲观锁:每次操作都会加锁,会造成线程阻塞。乐观锁:每次操作不加锁而是假设没有冲突而去完成某项操作,如果因为冲突失败就重试,直到成功为止,不会造成线程阻塞。Thre.

2021-06-23 15:34:17 116

原创 多线程(四)volatile

1 ⼏个基本概念1.1 内存可⻅性JMM有⼀个主内存,每个线程有⾃⼰私有的⼯作内存,⼯作内存中保存了⼀些变量在主内存的拷⻉。内存可⻅性,指的是线程之间的可⻅性,当⼀个线程修改了共享变量时,另⼀个线程可以读取到这个修改后的值。1.2 重排序为优化程序性能,对原有的指令执⾏顺序进⾏优化重新排序。重排序可能发⽣在多个阶段,⽐如编译重排序、CPU重排序等。1.3 happens-before规则是⼀个给程序员使⽤的规则,只要程序员在写代码的时候遵循happens-before规则,JVM就能保证

2021-06-23 10:21:50 88

原创 多线程(三)重排序与happens-before

1 什么是重排序?计算机在执⾏程序时,为了提⾼性能,编译器和处理器常常会对指令做重排。为什么指令重排序可以提⾼性能?简单地说,每⼀个指令都会包含多个步骤,每个步骤可能使⽤不同的硬件。因此,流⽔线技术产⽣了,它的原理是指令1还没有执⾏完,就可以开始执⾏指令2,⽽不⽤等到指令1执⾏结束之后再执⾏指令2,这样就⼤⼤提⾼了效率。但是,流⽔线技术最害怕中断,恢复中断的代价是⽐较⼤的,所以我们要想尽办法不让流⽔线中断。指令重排就是减少中断的⼀种技术。我们分析⼀下下⾯这个代码的执⾏情况:a = b + c;

2021-06-23 09:46:46 157

原创 多线程(二)Java内存模型(JVM-JMM)

1 并发编程模型的两个关键问题线程间如何通信?即:线程之间以何种机制来交换信息线程间如何同步?即:线程以何种机制来控制不同线程间操作发⽣的相对顺序有两种并发模型可以解决这两个问题:消息传递并发模型共享内存并发模型这两种模型之间的区别如下表所示:在Java中,使⽤的是共享内存并发模型。2 Java内存模型的抽象结构2.1 运⾏时内存的划分对于每⼀个线程来说,栈都是私有的,⽽堆是共有的。也就是说在栈中的变量(局部变量、⽅法定义参数、异常处理器参数)不会在线程之间共享,也就

2021-06-23 08:47:12 121

原创 生产者消费者模型

生产者-消费者模型是一个常见的多线程编程模型,如下图所示:一个内存队列,多个生产者线程往内存队列中放数据;多个消费者线程从内存队列中取数据。要实现这样一个编程模型,需要做下面几件事情:内存队列本身要加锁,才能实现线程安全。阻塞。当内存队列满了,生产者放不进去时,会被阻塞;当内存队列是空的时候,消费者无事可做,会被阻塞。双向通知。消费者被阻塞之后,生产者放入新数据,要notify()消费者;反之,生产者被阻塞之后,消费者消费了数据,要notify()生产者。第1件事情必须要做,第2

2021-06-22 10:59:10 179

原创 多线程(一)基础部分

1 进程与线程进程:进程是程序的一次动态执行过程,它经历了从代码加载、执行到执行完毕的一个完整过程,这个过程也是进程本身从产生、发展到消亡的过程进程:正在执行的程序,其实就是应用程序在内存中运行的那片空间线程:是进程中的一个执行单元,负责进程中的程序的运行,一个进程中一定要有线程,而且至少有一个一个进程可以有多个线程,那么这个应用程序可以称为多线程程序线程实际上是在进程基础之上的进一步划分如果一个进程没有了则线程肯定会消失,但是线程消失进程未必会消失并发:可以实现应用多部分程序同时执行所有

2021-06-21 18:53:18 120

原创 浅显理解 hashcode 和 hash 算法

HashCodehashcode源码public int hashCode() { int h = hash; if (h == 0 && value.length > 0) { char val[] = value; for (int i = 0; i < value.length; i++) { h = 31 * h + val[i]; } hash = h;

2021-06-20 17:19:06 180

原创 String

原文 http://tangxman.github.io/2015/07/27/the-difference-of-java-string-pool/String的应用无处不在,无论是算法题还是面试题,String都独占一方,甚至是无数面试者心中难以名状的痛。本文着重对String(若无特地说明,默认是JDK 1.8版本)常见的问题来进行介绍:1. 字符串的不可变性我们先来看看下面这段代码:public class Test { public static void main(Strin

2021-06-19 20:46:33 164

原创 第二部分:HashMap原理

1.HashMap的继承体系是什么样的?2.Node数据结构分析?3.底层存储结构介绍? 8.HashMap扩容原理?在 JDK 1.7 中 HashMap 是以数组加链表的形式组成的,JDK 1.8 之后新增了红黑树的组成结构,当链表大于 8 并且容量大于 64 时,链表结构会转换成红黑树结构,即使在hashcode 完全相同极端情况下,由于红黑树的特点,查找某个特定元素,也只需要O(log n)的开销,而如果查找链表,时间复杂度会退化到 O(n)。4.put数据原理分析?Hash

2021-06-19 14:50:23 96

原创 Dubbo

1. 分布式架构(SOA )分层: 按照业务性质分层 每一层要求简单 和 容易维护应用层: 距离用户最近的一层 也称之为接入层 使用tomcat 作为web容器 接收用户请求 使用下游的dubbo提供的接口来返回数据并且该层禁止访问数据库业务服务层:根据具体的业务场景 演变而来的模块基础业务层:拉勾网招聘业务的核心基础服务层:这一层 是与业务无关的模块 是一些通用的服务 这类服务的特点:请求量大 逻辑简单 特性明显 功能独立 消息服务(发邮件 短信 微信) 附件解析存储层:不同的存储类

2021-06-15 18:23:34 1326 1

原创 zookeeper笔记

ZooKeeper对分布式系统的协调,使⽤共享存储解决分布式系统⾯临的问题。其实共享存储,分布式应⽤也需要和存储进⾏⽹络通信。大多数分布式系统中出现的问题,都源于信息的共享出了问题。如果各个节点间信息不能及时共享和同步,那么就会在协作过程中产生各种问题。ZooKeeper解决协同问题的关键,就是在于保证分布式系统信息的一致性。zookeeper写流程zookeeper的基本概念Zookeeper是一个开源的分布式协调服务,其设计目标是将那些复杂的且容易出错的分布式一致性服务封装起来,构成一个

2021-06-06 22:01:51 118 2

原创 2-3树到红黑树

清晰理解红黑树的演变—红黑的含义我们回忆一下AVL树,它在插入和删除节点时,总要保证任意节点左右子树的高度差不超过1。正是因为有这样的限制,插入一个节点和删除一个节点都有可能调整多个节点的不平衡状态。频繁的左旋转和右旋转操作一定会影响整个AVL树的性能,除非是平衡与不平衡变化很少的情况下,否则AVL树所带来的搜索性能提升不足以弥补平衡树所带来的性能损耗。那有没有绝对平衡的一种树呢?没有高度差也不会有平衡因子,没有平衡因子就不会调整旋转操作。2-3树正是一种绝对平衡的树,任意节点到它所有的叶子节点的深度

2021-06-06 15:17:40 128

原创 Netty笔记

1. Socket回顾与I/0模型1.1 Socket概述Socket,套接字就是两台主机之间逻辑连接的端点。TCP/IP协议是传输层协议,主要解决数据如何在网络中传输,而HTTP是应用层协议,主要解决如何包装数据。Socket是通信的基石,是支持TCP/IP协议的网络通信的基本操作单元。它是网络通信过程中端点的抽象表示,包含进行网络通信必须的五种信息:连接使用的协议、本地主机的IP地址、本地进程的协议端口、远程主机的IP地址、远程进程的协议端口。1.2 Socket整体流程Socket

2021-06-01 14:47:27 79

原创 分布式&集群

1. ⼀致性Hash算法⼀致性哈希算法思路如下:⾸先有⼀条直线,直线开头和结尾分别定为为1和2的32次⽅减1,这相当于⼀个地址,对于这样⼀条线,弯过来构成⼀个圆环形成闭环,这样的⼀个圆环称为hash环。我们把服务器的ip或者主机名求hash值然后对应到hash环上,那么针对客户端⽤户,也根据它的ip进⾏hash求值,对应到环上某个位置,然后如何确定⼀个客户端路由到哪个服务器处理呢?按照顺时针⽅向找最近的服务器节点⼀致性哈希算法在服务节点太少时,容易因为节点分部不均匀⽽造成数据倾斜问题。例如系统中只

2021-05-20 02:05:45 108

原创 Tomcat剖析

⼀、Tomcat 系统架构与原理剖析1.1 浏览器访问服务器的流程http请求的处理过程1.2 Tomcat 系统总体架构1.2.1 Tomcat 请求处理⼤致过程Tomcat是⼀个Http服务器(能够接收并且处理http请求,所以tomcat是⼀个http服务器)我们使⽤浏览器向某⼀个⽹站发起请求,发出的是Http请求,那么在远程,Http服务器接收到这个请求之后,会调⽤具体的程序(Java类)进⾏处理,往往不同的请求由不同的Java类完成处理。HTTP 服务器接收到请求之后把请求交给

2021-05-20 01:38:45 84

原创 SpringBoot

一、SpringBoot基础应用1.1 约定优于配置概念:约定优于配置(Convention over Configuration),又称按约定编程,是一种软件设计规范。本质上是对系统、类库或框架中一些东西假定一个大众化合理的默认值(缺省值)。如果所用工具的约定与你的期待相符,便可省去配置;反之,你可以配置来达到你所期待的方式。简单来说就是假如你所期待的配置与约定的配置一致,那么就可以不做任何配置,约定不符合期待时才需要对约定进行替换配置。好处:大大减少了配置项1.2 SpringBoot

2021-05-12 00:39:57 285

原创 @Component和@Configuration

@Component和@Configuration作为配置类的差别@Component和@Configuration都可以作为配置类请看下面一段代码:@Configurationpublic class MyTestConfig { @Bean public Driver driver(){ Driver driver = new Driver(); driver.setId(1); driver.setName("driver");

2021-04-30 10:12:19 1995

原创 @Configuration的使用 和作用

原文从Spring3.0,@Configuration用于定义配置类,可替换xml配置文件,被注解的类内部包含有一个或多个被@Bean注解的方法,这些方法将会被AnnotationConfigApplicationContext和AnnotationConfigWebApplicationContext类进行扫描,并用于构建bean定义,初始化Spring容器。注意:@Configuration注解的配置类有如下要求:@Configuration不可以是final类型;@Configuration

2021-04-30 09:37:11 975

原创 SpringMVC基础+SSM整合

Spring MVC 九⼤组件HandlerMapping(处理器映射器)HandlerMapping 是⽤来查找 Handler 的,也就是处理器,具体的表现形式可以是类,也可以是⽅法。⽐如,标注了@RequestMapping的每个⽅法都可以看成是⼀个Handler。Handler负责具体实际的请求处理,在请求到达后,HandlerMapping 的作⽤便是找到请求相应的处理器Handler 和 Interceptor.HandlerAdapter(处理器适配器)HandlerAdapte

2021-04-26 23:53:30 157

原创 自定义IOC&AOP框架

一、核心思想1. IOC1.1 什么是IoC?IoC Inversion of Control (控制反转/反转控制),注意它是⼀个技术思想,不是⼀个技术实现描述的事情:Java开发领域对象的创建,管理的问题传统开发⽅式:⽐如类A依赖于类B,往往会在类A中new⼀个B的对象IoC思想下开发⽅式:我们不⽤⾃⼰去new对象了,⽽是由IoC容器(Spring框架)去帮助我们实例化对象并且管理它,我们需要使⽤哪个对象,去问IoC容器要即可我们丧失了⼀个权利(创建、管理对象的权利),得到了⼀个福利(不⽤

2021-04-17 20:36:43 76

原创 MyBatis-自定义持久层框架IPersistence

一、JDBC问题分析数据库配置信息存在硬编码问题解决:配置文件频繁创建释放数据库链接解决:连接池sql语句、设置参数、获取结果集参数均存在硬编码问题解决:配置文件手动封装返回结果集,较为繁琐解决:反射、内省二、自定义持久层框架设计思路分析使用端(项目):引入自定义持久层框架的jar包可以提供两部分配置信息: 数据库配置信息 sql配置信息(包括sql语句、参数类型、返回值类型)我们使用配置文件来提供这两部分信息:

2021-04-09 16:04:12 135

ThreadLocalMap之getEntry+getEntryAfterMiss.pdf

ThreadLocalMap之getEntry+getEntryAfterMiss.pdf

2021-07-08

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除