- 博客(162)
- 收藏
- 关注
原创 计算机基础——内存
Klass Word (32bit 4字节/8字节):这指向Metaspace(C++中) 中一个 Klass对象(记录对象元数据信息)Array Length (32bit 4字节):数组长度,如果是数据对象会有值。Mark Word(64bit 8字节) :记录对象源信息 例如:锁、对象年龄。分段和分页结合的方式:每个段有很多页,页表中存储段号和页号唯一映射物理帧号,在java中 对象的存储结构 是分为对象头,对象体。
2023-10-13 14:32:02 393
原创 《Java 并发编程实战》—— Java线程的生命周期
synchronized修饰的方法、代码块同一时刻只允许一个线程执行,其他线程只能等待,这种情况下,等待的线程就会从RUNNABLE转换到BLOCKED状态。,因为在JVM看来,等待CPU使用权(操作系统层面此时处于可执行状态)与等待I/O(操作系统层面此时处于休眠状态)没有区别,都是在等待某个资源,所以都归入了RUNNABLE状态。tab=catalog。Java语言里则把可运行状态和运行状态合并了,这两个状态在操作系统调度层面有用,而JVM层面不关心这两个状态,因为。...
2022-07-29 17:02:54 3411 1
原创 《Java 并发编程实战》—— 安全性、活跃性以及性能问题
使用“锁”要非常小心,但是如果小心过度,也可能出“性能问题”。“锁”的过度使用可能导致串行化的范围过大,这样就不能够发挥多线程的优势了,而我们之所以使用多线程搞并发程序,为的就是提升性能。这个技术方案,而实现互斥的方案有很多,CPU提供了相关的互斥指令,操作系统、编程语言也会提供相关的API。例如路人甲从左手边出门,路人乙从右手边进门,两人为了不相撞,互相谦让,路人甲让路走右手边,路人乙也让路走左手边,结果是两人又相撞了。当产生数据竞争时,不仅仅加锁就能解决这个问题的,要合理的利用锁的范围能力,...
2022-07-29 09:03:17 3521
原创 《Java 并发编程实战》—— Java内存模型:看Java如何解决可见性和有序性问题
导致可见性的原因是缓存,导致有序性的原因是编译优化,那解决可见性、有序性最直接的办法就是禁用缓存和编译优化。为了解决可见性和有序性问题,只需要提供给程序员按需禁用缓存和编译优化的方法即可。Java 内存模型规范了 JVM 如何提供按需禁用缓存和编译优化的方法。具体来说,这些方法包括 volatile、synchronized 和 final 三个关键字,以及六项 Happens-Before 规则volatile 关键字并不是 Java 语言的特产,古老的 C 语言里也有,它最原始的意义就是禁用 CPU 缓
2022-07-26 18:49:32 4163
原创 《Java 并发编程实战》——可见性、原子性和有序性问题:并发编程Bug的源头
Java领域一个经典的案例就是利用双重检查创建单例对象,例如下面的代码在获取实例getInstance()的方法中,我们首先判断instance是否为空,如果为空,则锁定Singleton.class并再次检查instance是否为空,如果还为空则创建Singleton的一个实例。早期的操作系统基于进程来调度CPU,不同进程间是不共享内存空间的,所以进程要做任务切换就要切换内存映射地址,而一个进程创建的所有线程,都是共享一个内存空间的,所以线程做任务切换成本就很低了。...
2022-07-26 17:57:51 4077
原创 函数式编程——Stream流
java8的Stream使用的是函数式编程模式,如同它的名字一样,它可以被用来对集合或者数组进行链状流式操作。可以方便的让我们的对集合或者数组操作;一定需要有终结操作数组:Arrays.stream(数组)或者使用Stream.of创建双列集合:转换成单列集合后再创建2.中间操作filter:可以对流中的元素进行过滤,符合条件的才保留;map:将流中的元素进行计算或者转换distinct :可以去除流中的重复元素 依赖的式object的equals方法来判断是否是相
2022-06-29 17:07:01 14032
原创 CompletableFuture学习
我理解就是同时执行多个任务,加快响应速度。并且多线程能更好的发挥CPU的能力。并发:如果CPU是单核单线程,通过时间片轮询交替运行多个任务,像这种逻辑上多线程运行,实际上是一个线程在运行叫做并发;并行:如果CPU是双核双线程,那两个CPU同时执行任务,那就叫做并行;线程池对于新手来说,有现成的api那么我们介绍一下ThreadPoolExecutor看源码:我们工作实际开发中经常用到CompletableFuture。那么他的作用是什么呢?作用:Api:三个一组三个一组三个一组三个一组一般项目中这样使
2022-06-14 17:31:13 12850 1
原创 Java SPI
SPI:全称是Service Provider Interface,全称是服务提供者接口它是从Java 6开始引入的,是一种基于ClassLoader来发现并加载服务的机制。ServiceLoader加载和发现Service Provider,而Service Provider是具体实现了Service接口我们拿JDBC举例:JDBC的流程:有了SPI,程序员不用在更换驱动名,只需要引入相应的JAR包即可;规范的配置文件:Service Provider类必须具备无参的默认构造方法:保证能加载到配置文件
2022-06-04 13:43:53 12612
原创 Java SLF4J学习总结
问题:当java程序使用任何一种日志框架,就要写不同的接入代码。当你修改日志框架你就需要更改代码,很麻烦,而且多种日志框架共存(第三方服务的日志),将维护多套日志配置文件。所以使用门面日志框架是很有必要的。解决:门面日志框架是抽象的API,它是利用了设计模式中的适配器模式Java应用程序和第三方服务均使用统一的门面日志框架,然后使用是适配层将门面日志框架和底层日志框架绑定,使用的是统一日志配置文件流程:使用:导入pom结合LombokSpringboot中集成SLF4J,添加Lombok,就
2022-06-01 16:57:29 12775
原创 Python学习记录—— pip install aip报错
在网上看到Python识别身份证的一个demo,准备实现一下,当导入必要的包时出现出误;各种原因导致pip下载失败查找网上的解决办法,大多数是切换镜像,我使用的是豆瓣的镜像。阿里云:http://mirrors.aliyun.com/pypi/simple豆瓣:http://pypi.douban.com/simple/清华大学:https://pypi.tuna.tsinghua.edu.cn/simple/中国科学技术大学:https://pypi.mirrors.ustc.edu.cn
2022-05-19 18:01:05 6200
原创 Python学习记录——pip和venv
pippip:python install package,python三方包管理工具。包管理工具:包是别人写好的代码。经常有这种情况,比如爬虫框架功能的A包,里面引用了负责解析页面的B包,B包引用了更加基础底层的C包。包关系成树状引用。B包依赖C包。直接使用A包,运行报错缺少B包,缺少依赖包。ip下有些大的包可能会很慢,那可以使用国内的镜像清华源:pypi.tuna.tsinghua.edu.cn/simple豆瓣源 :pypi.douban.com/simple腾讯源:mirrors.cl
2022-05-19 18:00:37 13130
原创 HashMap扩容死循环问题
HashMap扩容死循环问题源码分析问题(jdk1.7)一、首先hashmap单线程正常扩容遍历每个数组,依次遍历每个数组的链表,根据头插法由原来的1,2,3变为了3,2,1二、hashmap多线程扩容死循环问题两个线程 e1 ,e2此时 线程一先执行,但线程二的指向发生改变,改为线程变换后的具体存储;初始的e2指向0号位的1,但经过线程一的变换指向了2号位的1了,next也发生改变线程二开始在线程一的基础存储,当next2指向空时 。e.next=newTable[i],也就
2022-05-16 19:18:50 13904 1
原创 SSO单点登录简单实现
通过cookie来实现单点登录1.单点登录的流程cookie是用来在客户端存储数据的工具、在其中一个子系统登录,跳转到登录系统,登陆系统登陆完成,完成登录后会向发起登录的子系统写入一个cookie,保存用于认证用户是否登录的信息(token),其他子系统向服务器发起请求的时候,携带这个cookie完成登录。cookie的域要是所有子系统相同的域,这样所有子系统才能访问到这个cookie。2.单点登录流程图2.单点登录的编码(部分核心代码)代码链接:https://gitee.com/yueh
2022-03-27 09:36:31 13321 2
原创 Redis分布式锁实现
Redis不仅仅可以用来做缓存,还可以用来做分布式锁;Rrdis分布式锁实现使用setnxredLockredissonsetnxsetnx 这个方法是在插入前判断这个键是否已经存在,存在返回 0,不存在返回 1 。换言之,如果key存在就不加锁,不存在就加锁;key不存在时才能set成功;但是,单纯的使用senx,是会出现问题的;进程,锁没等释放,崩了,直接原地把锁带走了,导致系统中谁也拿不到锁。解决办法:设置一个过期时间持有锁的时间有一定限制,操作锁内资源超过设置的超时时
2022-03-18 16:13:05 13024 1
原创 3.11面试复盘
Spring事务异常一定会回滚吗?什么情况事务会失效?1、事务失效的7种情况1.1、未启用spring事务管理功能1.2、方法不是public类型的@Transaction 可以用在类上、接口上、public方法上,如果将@Trasaction用在了非public方法上,事务将无效。1.3、数据源未配置事务管理器spring是通过事务管理器了来管理事务的,一定不要忘记配置事务管理器了,要注意为每个数据源配置一个事务管理器:1.4、自身调用问题spring是通过aop的方式,对需要spring
2022-03-13 10:43:49 13702
原创 并发(面试)
并发三要素:原子性:指的是一个或者多个操作,要么全部执行并且在执行的过程中不被其他操作打断,要么就全部不执行。原子性是数据一致性的保障。可见性:指多个线程操作一个共享变量时,其中一个线程对变量进行修改后,其他线程可以立即看到修改的结果。(线程间的通信实现)有序性:程序的执行顺序按照代码的先后顺序来执行。单线程简单的事,多线程并发就进程线程区别进程是操作系统分配资源的单位线程是调度的基本单位,线程之间共享进程资源,线程是程序执行的最小单位一个进程由一个或多个线程组成,线程是一个
2022-03-05 11:08:21 12748
原创 Java线程池(面试)
线程池的优点线程池提供了一种限制和管理资源(包括执行一个任务)。 每个线程池还维护一些基本统计信息,例如已完成任务的数量。这里借用《Java 并发编程的艺术》提到的来说一下使用线程池的好处:降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。提高响应速度。当任务到达时,任务可以不需要的等到线程创建就能立即执行。提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控。Executor 框架通过
2022-03-04 20:14:55 12964 1
原创 常见Linux命令
Linux 脚本指令cd / 打开根目录ls 查看目录ll 查看详情蓝色 文件夹浅蓝色 目录红色 压缩包绿色 可执行文件彩色 多媒体文件mkdir 创建文件夹rz 上传文件ctrl +c 中断恢复rm -rf 文件名 彻底删除文件unzip +包名 解压包Tap键 根据某个字母检索联想sh 运行某个可执行文件cd …返回上一级vi 文件 进入某一文件mv 修改文件名pwd 显示当前绝对路径top 检查所有进程ps -ef 查看所有进程详细目录
2022-03-04 19:51:56 12856
原创 MQ消息队列
什么是消息队列我们可以把消息队列看作是一个存放消息的容器,当我们需要使用消息的时候,直接从容器中取出消息供自己使用即可。消息队列是分布式系统中重要的组件之一。使用消息队列主要是为了通过异步处理提高系统性能和削峰、降低系统耦合性。通过异步处理提高系统性能(减少响应所需时间)因为用户请求数据写入消息队列之后就立即返回给用户了,但是请求数据在后续的业务校验、写数据库等操作中可能失败。因此使用消息队列进行异步处理之后,需要适当修改业务流程进行配合,比如用户在提交订单之后,订单数据写入消息队列,不能立即返回
2022-02-26 12:45:12 18576
原创 Java线程的状态
Java中线程的状态分为6种。初始(NEW):新创建了一个线程对象,但还没有调用start()方法。运行(RUNNABLE):Java线程中将就绪(ready)和运行中(running)两种状态笼统的称为“运行”。线程对象创建后,其他线程(比如main线程)调用了该对象的start()方法。该状态的线程位于可运行线程池中,等待被线程调度选中,获取CPU的使用权,此时处于就绪状态(ready)。就绪状态的线程在获得CPU时间片后变为运行中状态(running)。阻塞(BLOCKED):表示线程阻塞于
2022-02-25 21:49:02 12603
原创 浅析Dubbo分布式架构
什么是 Dubbo?Apache Dubbo 是一款高性能、轻量级的开源Java RPC 框架,它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现。简单来说 Dubbo 是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。**Dubbo 的诞生和 SOA 分布式架构的流行有着莫大的关系。**SOA 面向服务的架构(Service Oriented Architecture),也就是把工程按照业务逻辑拆分成服务层、表现层两个
2022-02-22 22:20:08 12421
原创 HTTP是不保存状态的协议,如何保存用户状态?
HTTP是不保存状态的协议,如何保存用户状态?HTTP 是一种不保存状态,即无状态(stateless)协议。也就是说 HTTP 协议自身不对请求和响应之间的通信状态进行保存。那么我们保存用户状态呢?Session 机制的存在就是为了解决这个问题,**Session 的主要作用就是通过服务端记录用户的状态。**典型的场景是购物车,当你要添加商品到购物车的时候,系统不知道是哪个用户操作的,因为 HTTP 协议是无状态的。服务端给特定的用户创建特定的 Session 之后就可以标识这个用户并且跟踪这个用户了
2022-02-22 21:14:14 13280
原创 TCP 协议如何保证可靠传输?
应用数据被分割成 TCP 认为最适合发送的数据块。TCP 给发送的每一个包进行编号,接收方对数据包进行排序,把有序数据传送给应用层。校验和: TCP 将保持它首部和数据的检验和。这是一个端到端的检验和,目的是检测数据在传输过程中的任何变化。如果收到段的检验和有差错,TCP 将丢弃这个报文段和不确认收到此报文段。TCP 的接收端会丢弃重复的数据。流量控制: TCP 连接的每一方都有固定大小的缓冲空间,TCP的接收端只允许发送端发送接收端缓冲区能接纳的数据。当接收方来不及处理发送方的数据,能提示发送方.
2022-02-22 21:02:43 15754
原创 计算机网络—— OSI与TCP/IP各层的结构与功能及协议
OSI与TCP/IP各层的结构与功能,都有哪些协议?应用层:任务是通过应用进程间的交互来完成特定网络应用域名系统DNS,HTTP协议,电子邮件的 SMTP协议运输层:任务就是负责向两台主机进程之间的通信提供通用的数据传输服务运输层主要使用以下两种协议:传输控制协议 TCP(Transmission Control Protocol)–提供面向连接的,可靠的数据传输服务。用户数据协议 UDP(User Datagram Protocol)–提供无连接的,尽最大努力的数据传输服务(不保证
2022-02-22 20:30:52 14558
原创 序列化和反序列化
Java序列化,反序列化Java序列化指将Java对象转换为字节序列的过程,反序列化指将字节序列转换为目标对象的过程;什么情况下需要序列化(序列化的时间)当Java对象需要网络传输或者持久化到磁盘上时;序列化的实现?让类实现Serializable接口,标注该类对象可以被序列化;...
2022-02-22 20:16:21 12361
原创 Spring bean的生命周期和Spring是如何解决循环依赖的?
问:Spring对Bean的生命周期管理?答:普通Java对象和Spring所管理的Bean实例化的过程是有些区别的在普通Java环境下创建对象简要的步骤可以分为:java源码被编译为被编译为class文件等到类需要被初始化时(比如说new、反射等)class文件被虚拟机通过类加载器加载到JVM初始化对象供我们使用而是Spring管理的Bean不同,除了Class对象外,还会使用BeanDefinition的实例来描述对象;可以理解为:Class只描述了类的信息,而BeanDefiniti
2022-02-19 11:38:48 12826
原创 面试——讲讲什么是happens-before?
happens-before的概念来阐述操作之间的内存可见性。在JMM中,如果一 个操作执行的结果需要对另一个操作可见,那么这两个操作之间必须要存在happens-before关系程序顺序规则:一个线程中的每个操作,happens-before于该线程中的任意后续操作监视器锁规则:对一个锁的解锁,happens-before于随后对这个锁的加锁。volatile变量规则:对一个volatile域的写,happens-before于任意后续对这个volatile域的读·传递性:如果A happens
2022-02-18 22:06:32 11406
原创 Spring如何处理线程的并发问题?
1、可以将成员变量声明在方法内。2、将成员变量放在ThreadLocal之中。(ThreadLocal userName = new ThreadLocal<>();)成员变量放在ThreadLocal之中,传进来的参数是跟随线程的,所以也是线程安全的。ThreadLocal 则从另一个角度来解决多线程的并发访问。ThreadLocal会为每一个线程提供一个独立的变量副本,从而隔离了多个线程对数据的访问冲突。因为每一个线程都拥有自己的变量副本,从而也就没有必要对该变量进行同步了。Thr
2022-02-18 21:30:56 13331
原创 面试——Maven中jar包冲突如何解决?
Maven中jar包冲突如何解决?产生:一般产生冲突都是jar的版本问题;解决方案1、 Maven默认处理策略最短路径优先(一般选取依赖关系短的)最先声明优先(如果长度相同,选取依赖关系先声明的)2、移除依赖:用于排除某项依赖的依赖jar包我们可以借助Maven Helper插件中的Dependency Analyzer分析冲突的jar包,然后在对应标红版本的jar包上面点击execlude,就可以将该jar包排除出去。手动排除 pom.xml中使用标签去排除冲突的jar包3、版
2022-02-18 20:53:26 11651
原创 面试——类加载(Tomcat,Spring,Java)
Java类加载Java类加载的时机一个类型从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期将会经历加载 (Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)、初始化 (Initialization)、使用(Using)和卸载(Unloading)七个阶段,其中验证、准备、解析三个部分统称 为连接(Linking)。Java——双亲委派机制(总是由父类先加载类,如果父类加载不了,才有子类加载)三次破坏加载;1.自定义类加载
2022-02-18 20:32:24 11656
原创 (修改后)Java中的String类占用多大的内存空间?
空String占用的空间40对象头(8 字节)+ 引用 (4 字节 ) + char 数组(16 字节)+ 1个 int(4字节)+ 1个long(8字节)= 40 字节非空String占用的空间40 + 2 * n (代表字符串长度)char[]数组中的一个char类型的数据占用2个字节的空间,所以,只是String中的数据就会占用 2 * n(n为字符串的长度)个字节的空间,再加上空字符串所占用的40个字节空间,最终得出一个字符串所占用的存储空间为: 40 + 2 * n (n为字符串长度
2022-02-18 09:41:28 15258 4
原创 当你在浏览器地址栏输入一个URL后回车,浏览器做了什么?(面试题)
以下是一个大概流程:浏览器向DNS服务器查找输入URL对应的IP地址。DNS服务器返回网站的IP地址。浏览器根据IP地址与目标web服务器在80端口上建立TCP连接浏览器获取请求页面的html代码。浏览器在显示窗口内渲染HTML。窗口关闭时,浏览器终止与服务器的连接。之后引出TCP三次握手四次挥手DNS查找过程如下:浏览器缓存 – 浏览器会缓存DNS记录一段时间。 有趣的是,操作系统没有告诉浏览器储存DNS记录的时间,这样不同浏览器会储存个自固定的一个时间(2分钟到30分钟不等)。系
2022-02-16 16:17:08 11355
原创 Redis回顾(面试)
1. 简单介绍一下 Redis 呗!简单来说 Redis 就是一个使用 C 语言开发的数据库,不过与传统数据库不同的是 Redis 的数据是存在内存中的 ,也就是它是内存数据库,所以读写速度非常快,因此 Redis 被广泛应用于缓存方向。另外,Redis 除了做缓存之外,Redis 也经常用来做分布式锁,甚至是消息队列。Redis 提供了多种数据类型来支持不同的业务场景。Redis 还支持事务 、持久化、Lua 脚本、多种集群方案。2. 说一下 Redis 和 Memcached 的区别和共同点现
2022-02-16 15:34:49 11275
原创 MySQL回顾(面试)
什么是MySQL?MySQL 是一种关系型数据库,在Java企业级开发中非常常用,因为 MySQL 是开源免费的,并且方便扩展。MySQL的默认端口号是3306。MyISAM和InnoDB区别两者的对比:是否支持行级锁 : MyISAM 只有表级锁(table-level locking),而InnoDB 支持行级锁(row-level locking)和表级锁,默认为行级锁。是否支持事务和崩溃后的安全恢复: MyISAM 强调的是性能,每次查询具有原子性,其执行速度比InnoDB类型更快,但是
2022-02-16 11:06:20 11262
原创 JVM回顾总结(面试)
讲述JVM模型首先,java文件jdk的编译,编译成class文件,通过类加载器进入jvm中,jvm分为,程序计数器,本地方法栈,虚拟机栈,方法区,堆;程序计数器:我理解的就是控制线程跳转的虚拟机栈:具有栈帧,每个栈帧对应一个被调用的方法,在栈帧中包括局部变量表、操作数栈等等。例如定义的局部变量存栈(存在栈帧中的局部变量表中),全局变量存堆;本地方法栈:和虚拟机栈一样,只不过是操作的是本地方法;方法区:是被线程共享的区域。在方法区中,存储了每个类的信息(包括类的名称、方法信息、字段信息)、静态.
2022-02-16 09:58:46 7204
原创 拦截器和过滤器的区别
过滤器跟拦截器的区别spring mvc的拦截器是只拦截controller而不拦截jsp,html 页面文件的。过滤器filter,filter是在servlet前执行的,你也可以理解成过滤器中包含拦截器,一个请求过来,先进行过滤器处理,看程序是否受理该请求 。 过滤器放过后 , 程序中的拦截器进行处理 。1、拦截器不依赖servlet容器,过滤器依赖;2、拦截器是基于java反射机制来实现的,过滤器基于回调过滤器:关注web请求;拦截器:关注方法调用;Spring拦截器分类sprin
2022-02-15 10:43:33 11346
原创 Maven 编译:Please refer to dump files (if any exist) [date].dump, [date]-jvmRun[N].dump and [date]
问题描述:使用maven进行打包 install package时报错Maven 编译:Please refer to dump files (if any exist) [date].dump, [date]-jvmRun[N].dump and [date]解决一:解决二:更改pom.xml<build> <plugins> <plugin> <groupId>org.
2022-02-15 10:38:43 11669 1
原创 Java基础回顾(面试)
八种基本类型long 8字节 int 4字节 short 2 字节 byte 1 字节boolean 4字节 double 8字节 float 4字节char (根据编码 ASCII 码 1字节 Unicode 2字节 )根据八种基本类型引出 float和int 的精度问题越近0精度越高(大于int) 离0越远精度低 (低与int)根据int引出128陷阱-127 ------ 128 如数字没超过这个范围存在同一个对象中,超过那么就要重新创建一个对象(新开辟一个空间).
2022-02-13 14:30:11 11462
原创 HashMap和ConcurrentHashMap和Hashtable的区别
HashMap和Hashtable的区别1.线程安全不同HashMap是非线程安全的,只是用于单线程环境下;ConcurrentHashMap是线程安全的,多线程环境下可用;Hashtable是线程安全的,能用于多线程环境中;2.继承的父类不同HashMap继承自AbstractMap类。但二者都实现了Map接口。Hashtable继承自Dictionary类,Dictionary类是一个已经被废弃的类(见其源码中的注释)。父类都被废弃,自然而然也没人用它的子类Hashtable了。
2022-02-13 08:52:44 15932
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人