自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(15)
  • 资源 (2)
  • 收藏
  • 关注

原创 方法上加上 synchronized 就可以了么

我们先来看一段代码代码中定义两个变量 counter1 和 counter2 , 方法 sum 对两个变量循环 1000 次进行求和;方法 isEqual 对这两个变量进行测试看是否一直相等。如果一直相等,程序结束后是不会有输出的。从代码上来看, 我们在 sum 方法中同时对 counter1 和 counter2 进行加和, 它们应该说是一直相等的。但是运行之后,我们会发现程序结束后有很多次都出现了 counter1 和 counter2 不相等的情况。

2023-07-26 19:03:45 159 1

原创 JVM 调优的一些思考和总结

首先贴一张 JVM 的架构图方便基础忘记的小伙伴来快速回忆方法区(Method Area)所有类级别数据将被存储在这里,包括静态变量。每个JVM只有一个方法区,它是一个共享的资源。堆区(Heap Area)所有的对象和它们相应的实例变量以及数组将被存储在这里。每个JVM同样只有一个堆区。由于方法区和堆区的内存由多个线程共享,所以存储的数据不是线程安全的。栈区(Stack Area)如果想详细了解方法栈的底层机构,可以去看我另一篇文章对每个线程会单独创建一个运行时栈。

2023-07-26 13:46:33 76 1

原创 线程池中线程重用导致的问题

但是我们知道, tomcat 容器用的也是线程池来处理这些请求的, 如果第一个请求和第二个请求用的是同一个线程会出现什么情况呢。在业务逻辑中,我先从 ThreadLocal 获取一次值,然后把外部传入的参数设置到 ThreadLocal 中,来模拟从当前上下文获取到用户信息的逻辑,随后再获取一次值,最后输出两次获得的值和线程名称。这个demo是比较极端的,主要是告诉大家线程池会重用固定的几个线程,一旦线程重用,那么很可能首次从 ThreadLocal 获取的值是之前其他用户的请求遗留的值。

2023-07-25 16:59:38 125

原创 MySQL的索引相关

MySQL 把数据存储和查询操作抽象成了存储引擎,不同的存储引擎,对数据的存储和读取方式各不相同。MySQL 支持多种存储引擎,并且可以以表为粒度设置存储引擎。因为支持事务,我们最常使用的是 InnoDB。那么InnoDB 是如何存储数据的?虽然数据保存在磁盘中,但其处理是在内存中进行的。为了减少磁盘随机读取次数,InnoDB 采用页而不是行的粒度来保存数据,即数据被分成若干页,以页为单位保存在磁盘中。InnoDB 的页大小,一般是 16KB。

2023-07-25 13:44:33 46

原创 Docker 镜像构建

镜像的定制实际上就是定制每一层所添加的配置、文件。如果我们可以把每一层修改、安装、构建、操作的命令都写入一个脚本,用这个脚本来构建、定制镜像,那么之前提及的无法重复的问题、镜像构建透明性的问题、体积的问题就都会解决。这个脚本就是 Dockerfile。Dockerfile 是一个文本文件,其内包含了一条条的 指令(Instruction),每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。

2023-07-25 13:41:19 50

原创 Docker 多平台镜像构建

背后的原理也很简单,之前已经提到过了,buildx 会通过 QEMU 和 binfmt_misc 分别为 3 个不同的 CPU 架构(arm,arm64 和 amd64)构建 3 个不同的镜像。现在就可以通过 docker pull mirailabs/hello-arch 拉取刚刚创建的镜像了,Docker 将会根据你的 CPU 架构拉取匹配的镜像。–w------- 1 root root 0 11月 18 00:09 register。现在我们就可以构建支持多 CPU 架构的镜像了!

2023-07-25 13:40:31 154

原创 连接池使用时候的注意事项

现在有很多的三方连接池之类的SDK,我们在使用的过程中一定要明白一个准则,那就是这个SDK是否是基于连接池的。我们知道,TCP 是面向连接的基于字节流的协议:面向连接,意味着连接需要先创建再使用,创建连接的三次握手有一定开销;基于字节流,意味着字节是发送数据的最小单元,TCP 协议本身无法区分哪几个字节是完整的消息体,也无法感知是否有多个客户端在使用同一个 TCP 连接,TCP 只是一个读写数据的管道。

2023-07-25 13:39:02 34

原创 反射、注解和泛型相关的坑

根据反射来获取方法,很多人觉得获取方法传入参数就可以了,但是遇到方法的重载的时候,怎么能够知道此次执行走的是哪个方法呢?但使用反射时的误区是,认为反射调用方法还是根据入参确定方法重载但是事实证明,反射调用方法,是以反射获取方法时传入的方法名称和参数类型(方法的签名)来确定调用方法的。

2023-07-25 13:36:38 30

原创 Java内存结构详解

Java 的内存结构1. 程序计数器Java源码文件被编译为字节码文件,字节码文件在程序运行中被读入jvm中,jvm中的每个线程都会有一个属于自己的程序计数器(PC),程序都是由CPU逐条进行执行的,PC记录的就是当前线程执行到的代码的位置。每个线程都有属于自己的PC,因此PC是线程私有的,并不是共享的。如果当前线程执行的是Java中的方法,那么当前线程的PC就是记录的方法所执行到的位置;而如果当前线程执行的并不是Java中的方法,而是使用Native修饰的方法,则PC则是未被定义的。综上所述,P

2021-03-01 10:03:15 115

原创 Docker安装配置 nginx

目前情况下,随着云服务和微服务的蓬勃发展,越来越多的公司和项目向微服务和虚拟化的路上靠拢,既然要虚拟化和容器化,那么docker肯定要掌握的,docker 有什么好处就不用多说了,总之一点,有了docker,我们安装各种环境爽多了。最近,整理了一下自己使用的测试环境,因此我就下决心使用 docker 来部署一下 nginx ,以后的项目都采用 docker 来进行部署,使用 nginx 来进行反向代理。那么第一步肯定就是使用 docker 来安装 nginx ,先把镜像拉下来 :docker pull

2021-03-01 10:02:30 183 2

原创 Docker安装部署常用服务

docker 的默认安装源在国内比较慢,我们可以把docker 的官方源替换成国内的源;创建或者修改 /etc/docker/daemon.json 配置文件vim /etc/docker/daemon.json## 添加以下的内容{ "registry-mirrors" : [ "https://registry.docker-cn.com", "https://docker.mirrors.ustc.edu.cn", "http://hub-mirror.c.1

2021-03-01 10:01:25 119

原创 Oauth2.0 + JWT 实现单点登录

上一节,我们讲述了Oauth2.0 配合security的使用,配合redis去存token,或者配合Jwt去存token。这篇文章,我们主要来系统的串起来讲一下,从宏观的层面来讲述一下单点登录,并且来实现一个demo。首先,我们来借助一个真实的案例来切入:相信大家都登录过码云吧:(https://gitee.com/)在登录选项里我们选择使用三方账号进行登录(QQ)然后他就会跳转到下面这个地址:https://graph.qq.com/oauth2.0/show?which=Login&amp

2021-02-25 16:52:46 3441 1

原创 SpringBoot中SpringSecurity+JWT的使用

​ 做过权限认证的朋友都清楚,SpringSecurity 的功能很强大,但是我们也都知道,它配置起来也着实让人头疼。N多个配置类还有N多个需要实现的接口,总是记不住和不知道为什么会有这么多,最近在学习这方面的东西,正好能够把学习到的东西分享出来给大家参考一下。​ 在目前网上的很多博文中,只是把配置文件贴出来,根本没告诉为什么这么配置,都需要配置哪些东西。其实我们在理解了一些远离之后,就能够笔记哦啊清晰的去记住这些配置文件。1. Oauth2.0 的使用简介OAuth 2.0是用于授权的行业标准协议

2021-02-23 18:38:09 658

原创 Springboot 中 Filter 的使用

要使用Filter,首先我们应该了解过滤器与拦截器的区别区别如下:1 、拦截器是基于java的反射机制的,而过滤器是基于函数回调。2 、拦截器不依赖与servlet容器,过滤器依赖与servlet容器。3 、拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用。4 、拦截器可以访问action上下文、值栈里的对象,而过滤器不能访问。5 、在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次。在 Spring Boot中使用Filter有两种

2021-02-08 11:01:33 219

原创 Java 的内存结构

Java 的内存结构1. 程序计数器Java源码文件被编译为字节码文件,字节码文件在程序运行中被读入jvm中,jvm中的每个线程都会有一个属于自己的程序计数器(PC),程序都是由CPU逐条进行执行的,PC记录的就是当前线程执行到的代码的位置。每个线程都有属于自己的PC,因此PC是线程私有的,并不是共享的。如果当前线程执行的是Java中的方法,那么当前线程的PC就是记录的方法所执行到的位置;而如果当前线程执行的并不是Java中的方法,而是使用Native修饰的方法,则PC则是未被定义的。综上所述,P

2021-02-08 11:00:38 239

ACM算法内部资料.zip

acm培训的内部资料,为参加acm的同学们提供很好的资料来学习,各种常见的算法都包含在内,acm常见的套路与模版应有尽有

2021-01-05

java 经典课程设计案例

里面有很多的案例,能够作为Java可能设计提供参考

2021-01-05

空空如也

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

TA关注的人

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