- 博客(36)
- 收藏
- 关注
原创 线程池中的线程数量设置为多少比较合适?
经验公式 `2N+1` 中,`N` 是 CPU 核心数,2N 的线程数确保在 IO 等待时仍有线程执行计算,`+1` 确保至少一个线程始终工作。因为此时这台主机上,已经有很多运行中的线程了,Tomcat有自己的线程池,HikariCP也有自己的后台线程,JVM也有一些编译的线程,连G1都有自己的后台线程。在 CPU 密集型应用中,线程数通常设置为 `N+1`(`N` 为 CPU 核心数),这样能充分利用每个核心,并提供一个额外线程应对短暂阻塞,确保 CPU 不因偶然停顿而闲置。这样给出的线程池参数才合理。
2024-10-27 04:25:44 837
原创 说说SQL调优
SQL调优主要可以从三个方面来讲,分别是和。,例如;适当主从架构读写分离,搭建集群,引入redis缓存,分库分表定长的字符串字段,使用固定长度char类型,字符串长度动态变化的则使用varchar类型时间类型字段尽量使用timestamp,占用字节数少,并且够用一些枚举尽量使用int或者tniyint禁止使用select *,需要查询什么列数据就查询什么;尽量使用小表驱动大表;limit大分页优化:select * from user where id>10000 limit 10;
2024-10-27 04:23:43 613
原创 如何理解MVCC
那 Read View 到底是个什么东西?Read View 是事务开始或读取数据时创建的一致性视图,记录了当前系统中活跃事务的集合。这个视图帮助事务确定哪些版本的数据是可见的。通过 Read View,事务能够看到在其开始时已经提交的事务产生的数据版本,而忽略未提交的事务的数据版本。当前活跃的事务编号列表。指的是在创建 Read View 时,当前数据库中「活跃事务」的事务id编号列表,注意是一个列表,“活跃事务”指的就是,启动了但还没提交的事务。最小活跃事务编号。
2024-09-22 15:59:38 994
原创 Synchronized的底层实现
未被锁定的对象的该计数器为 0,当一个线程获得锁(执行 monitorenter )后,该计数器自增变为 1 ,当同一个线程再次获得该对象的锁的时候,计数器再次自增。当计数器为 0 的时候。当某个线程要访问某个方法的时候,会检查是否有 ACC_SYNCHRONIZED,如果有设置,则需要先获得监视器锁,然后开始执行方法,方法执行之后再释放监视器锁。当同步方法执行完后,该对象的 monitor 的计数器减1,计数器的值为0时,执行线程将释放 monitor(锁),其他线程才有机会持有 monitor。
2024-09-14 02:07:38 707
原创 说说synchronized的锁升级过程
在 JDK 1.6之前,synchronized 是一个重量级、效率比较低下的锁,但是在JDK 1.6后,JVM 为了提高锁的获取与释放效,,对 synchronized 进行了优化,引入了和。锁升级就是的一个过程,注意,依次从耗费资源最少,性能最高,到耗费资源多,性能最差(Header)、(Instance Data)和:分为Mark Word 和 类型指针:存储对象的实际有效信息,也就是我们在类中所定义的各种类型的字段内容。
2024-09-14 02:04:54 888
原创 谈谈你对AQS的理解
AQS,全称为AbstractQueuedSynchronizer,是Java并发包(java.util.concurrent)中一个核心的框架,主要用于构建阻塞式锁和相关的同步器,也是构建锁或者其他同步组件的基础框架。AQS提供了一种基于FIFO(First-In-First-Out)的CLH(三个人名缩写)双向队列的机制,来实现各种同步器,如ReentrantLock、Semaphore、CountDownLatch等。
2024-06-27 00:05:06 907
原创 说说ReentrantLock的实现原理
ReentrantLock翻译过来是可重入锁,是 Java 并发包 java.util.concurrent.locks 中的一个锁实现,它提供了比 synchronized 关键字更丰富的功能。可中断可以设置超时时间可以设置公平锁支持多个条件变量与synchronized一样,都支持重入。
2024-06-26 17:39:13 416
原创 谈谈你对 volatile 的理解
无法修饰方法及代码块等。通常,在没有volatile时,一个线程对变量的修改可能会被缓存到线程本地的CPU缓存中,其他线程无法立即看到这种修改。情况四:先执行actor1()方法中第二行代码,然后执行actor2()方法获取结果,y为1、x为0,此时不正常,发生了指令重排序,影响结果。情况二:先执行actor1()方法中的第一行代码,然后执行actor2()方法获取结果,y为0、x为1,此时正常。情况三:先执行actor1()方法中所有代码,然后执行actor2()方法获取结果,y为1、x为1,此时正常。
2024-06-25 23:12:27 361 1
原创 面试题:说说你是如何理解CAS的?
ABA问题是多线程编程中使用CAS(Compare-And-Swap)操作时遇到的一种典型问题。它指的是这样一种情况:一个线程在执行CAS操作时,发现目标变量的值已经从初始值A变成了B,然后又变回了A。由于CAS操作只检查值是否等于预期值(A),它无法检测出值曾经被其他线程修改过。因此,CAS操作会误认为值没有变化,从而继续执行,这可能会导致数据一致性问题。
2024-06-25 19:49:59 694
原创 如何解决ThreadLocal内存泄漏问题?
内存泄漏是指程序无法再使用某些内存,但这些内存却不会被回收,导致系统内存的浪费,最终可能导致内存不足。中的内存泄漏问题主要是因为的键是弱引用,而值是强引用。让我们更详细地分析这个问题。
2024-06-25 03:31:44 555
原创 说说ThreadLocal的实现原理
独立性:每个线程拥有自己的 ThreadLocalMap 实例,因此对 ThreadLocal 的操作不会相互干扰。线程安全:由于每个线程有独立的 ThreadLocalMap,不存在并发访问 ThreadLocalMap 的问题,因此操作是线程安全的。这种设计使得 ThreadLocal 非常适合在多线程环境下使用,用于存储线程私有的变量,从而避免了线程间的数据共享问题。
2024-06-25 03:26:11 834
原创 简单说说mysql中的sql执行流程
用自己的话来说就是,首先进行查询缓存,缓存中查询到结果则直接返回,若缓存中查询不到结果,sql语句就要进入解析器进行语法解析,生成解析树。得到解析树后又要经过优化器进行优化得到查询计划,最后进入执行器执行查询计划,返回查询结果并且写入缓存。
2024-01-19 01:19:46 429 1
原创 并发编程之CAS
再次强调,由于CAS是一种系统原语,原语属于操作系统用语范畴,是由若干条指令组成的,用于完成某个功能的一个过程,并且原语的执行必须是连续的,在执行过程中不允许被中断,也就是说CAS是一条CPU的原子指令,不会造成所谓的数据不一致问题。CAS是实现自旋锁的基础,CAS利用CPU指令保证了操作的原子性,以达到锁的效果,至于自旋锁---字面意思自己旋转。是指尝试获取锁的线程不会立即阻塞,而是采用循环的方式去尝试获取锁,当线程发现锁被占用时,会不断循环判断锁的状态,直到获取。题目:实现一个自旋锁,借鉴CAS思想。
2023-12-26 19:15:47 936
原创 浅谈线程中断
一个线程不应该由其他线程来中断或者停止,应该由线程自己自行停止。Java中没有办法立即停止线程,但是Java提供了一种用于停止线程的协商机制--中断机制,也叫中断标识协商机制。中断只是一种协作协商机制,中断的过程由程序员自己实现。若想要中断一个线程,你需要手动调用改线程的interrupt方法,该方法给当前线程的中断标识设置为true,接着你需要写代码检测中断标识,根据当前线程的中断标识自行决定具体要做什么。
2023-12-25 17:22:38 452
原创 浅谈悲观锁与乐观锁
只有在更新数据的时候才会去判断,之前有没有别的线程操作过这个数据。如果这个数据已经被其他线程被更新,则会根据不同的实现方式进行不同的操作。比如放弃修改,重试抢锁。在Java中sychronized关键字或者Lock的实现类都是悲观锁,悲观锁的使用场景,适合使用在写操作比较多的场景。悲观锁比较悲观,认为在使用数据的时候,一定会有别的线程来修改数据,因此在获取到数据后会先加锁,确保数据不会被别的线程给修改。乐观锁比较乐观,认为在使用数据的时候,不会有其他线程来修改数据,不会添加锁。1.版本号version。
2023-12-24 21:14:30 419
原创 云服务器使用docker安装elasticsearch,并且添加ik分词器
首先得下载好ik分词器,下载好分词器后,解压后并且解压出来的文件上传到服务器上的一个自定义目录下,这里我放到/usr/local/es/ik目录下,然后进入es容器内部,创建ik文件夹,再把解压后的ik分词器资源文件复制到es容器的ik文件夹下,最后重启es即可配置好ik分词器。4.退出es容器,在外部复制云服务器/usr/local/es/ik目录下的所有文件到es容器内部的ik文件夹下。到此es就安装成功了,然后我们来给es添加ik分词器插件。2.拉取es镜像,这里我们选择7.3.1版本的镜像。
2023-12-20 15:47:29 505
原创 阿里云服务器使用Docker安装mysql,redis,minio,配置基础环境教程
这里我们启动容器时设置mysql登录密码为123456,你也可以自定义自己想设置的密码,修改MYSQL_ROOT_PASSWORD=再新建一个文件夹 /usr/local/mysql/data和/usr/local/mysql/conf/my.cnf配置文件。访问方式:你的阿里云服务器ip地址:9090,进入minio的界面,输入用户名或密码后可以访问。MySQL这里的版本我们选择5.7,首先第一步就是拉取镜像。这里我们拉取minio/minio这个镜像。然后查看我们拉取的镜像。启动容器,启动命令如下。
2023-11-04 20:35:55 401 1
原创 云服务器上使用docker安装xxl-job
下载完后在本地电脑解压xxl-job-2.3.1.zip,找到配置文件 application.properties,在window电脑本地修改配置文件 application.properties内容,然后再上传修改后的 application.properties覆盖云服务上的配置文件。在你的云服务器上创建/data/soft/xxl-job ,创建/data/soft/xxl-job/applogs。访问地址:http://{你的服务器地址}:8088/xxl-job-admin。
2023-09-23 03:50:15 487 1
原创 springboot项目中如何获取请求头当中的token
在service层中获取token需要使用相应的工具类,这里我分享一个有用的工具类。直接在相应的service业务层中使用工具类获取当前请求的token。一.直接在controller层当中直接获取token。那么这个工具类如何使用呢?二.在service业务层获取token。获取token方式1。获取token方式2。
2023-09-07 21:53:48 6079
原创 css动态样式的几种常见写法
这样可以根据组件的状态、属性或计算逻辑来动态生成样式,从而实现样式的动态变化。在 vue项目开发中,你有多种方式来创建动态样式,具体取决于你的需求和偏好。你可以根据组件的状态、属性或计算属性来生成动态样式,使你的 UI 更加灵活和交互式。你可以使用 v-bind 或简写的 : 来绑定样式属性,使其与组件的数据或计算属性相关联。使用 `:class` 或简写的 `:` 来绑定类名,然后在对象中定义类名和条件。在这个示例中,buttonStyle 计算属性根据 clicked 数据的状态来生成动态样式。
2023-08-12 01:49:37 3897 1
原创 简单聊聊mysql建表时为什么要创建索引
索引是一种特殊的数据结构,它可以对数据库表中的某一列或多列的值进行排序,并创建一个快速访问的路径,从而加快数据库的查询操作。3. 过多或不合理的索引会降低性能:过多的索引会增加数据库的维护负担,并且在更新数据时需要更新多个索引,导致性能下降。因此,在创建索引时需要谨慎考虑,并根据具体的查询需求和数据表的特点选择合适的列作为索引,以充分发挥索引的优势,避免索引带来的不良影响。4. 提高连接查询性能:当进行连接查询时,如果连接的列有索引,可以减少连接操作的时间,提高连接查询的性能。
2023-07-28 00:41:37 384 1
原创 聊聊开发中常见几种Spring Cloud Config 的配置文件bootstrap.yml、bootstrap-dev.yml 和 bootstrap-prod.yml
`bootstrap-prod.yml` 是 `bootstrap.yml` 的一个特定生产环境的 profile,用于在生产环境下加载特定的外部配置信息,通过激活不同的 profile 加载对应的配置。- `bootstrap-dev.yml` 是 `bootstrap.yml` 的一个特定开发环境的 profile,用于在开发环境下加载特定的外部配置信息,通过激活不同的 profile 加载对应的配置。- 在开发环境中,可能需要与生产环境不同的配置,例如连接到不同的数据库、使用不同的服务地址等。
2023-07-23 10:39:45 6403 1
原创 springboot报错Error creating bean with name ‘dataSource‘的解决方案
此异常的根本原因是类“org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType”的“NoClassDefFoundError”。要解决此问题,应确保在项目的生成配置中正确包含必要的依赖项。具体来说,您需要确保在构建文件(例如,Maven的pom.xml或Gradle的build.Gradle)中正确指定了“spring-jdbc”依赖项。Spring应用程序中名为“dataSource”的bean的依赖项注入存在问题。
2023-05-17 16:10:36 9515
原创 mysql创建表,设置表主键id从1开始自增
当我们在做项目的时候,创建一张用户表,如何让该表的主键id从0开始自增?最后我们只需要在Java实体类的id字段上加上一个注解,规定mybatisplus在添加新表时按照数据库表设计时id的只增规则只增即可,该注解为。(4)使用mybatisPlus创建生成实体类时,指定该实体类的id自增规则为数据库只增规则。下面给出该实体类的完整Java代码,到这里我们也就实现了建表id按照自增规则自增功能。(3)再插入一条不指定id内容的数据表,让表的id自增。可以看出,生成的表id已经是按照只增1的规则只增了。
2023-03-21 17:57:48 12427 1
原创 微信开放平台申请移动应用时如何获取已经安装的第三方app的应用签名
此时点击签名生成工具,下载对应的获取应用签名安卓app(名为Gen_Signature_Android),下载后解压成apk安卓安装包,再把安装包发送到自己的手机上进行安装。Gen_Signature_Android软件输入具体要获取的第三方应用的包名,再点击get Signnatrue就可获取应用签名。点击进入/Android/data目录(应用的安装根目录),此时页面的每一个子目录名即为软件的包名目录。点击进入后发现没有访问权限,点击查看即可,再重复上面的操作,进入Android/data目录即可。
2023-02-28 17:26:01 2929
转载 uniapp npm引入uView组件库
如果您的项目是由HBuilder X创建的,相信已经安装scss插件,如果没有,请在HX菜单的 工具->插件安装中找到"scss/sass编译"插件进行安装, 如不生效,重启HX即可。在项目src目录中的main.js中,引入并使用uView的JS库,注意这两行要放在import Vue之后。如果您的项目是由vue-cli创建的,请通过以下命令安装对sass(scss)的支持,如果已安装,请略过。uView依赖SCSS,您必须要安装此插件,否则无法正常运行。在项目src目录的uni.scss中引入此文件。
2023-02-23 20:07:02 543
原创 前后端分离项目SpringBoot+SpringSecurity 图片验证码登录功能的实现(详细)
前后端分离项目基础登录流程前后端分离项目中无法使用session,所以使用jwt生成token令牌作为客户端进行请求的一个标识,当用户第一次登录后,服务器生成一个token并将此token返回给客户端,以后客户端只需带上这个token前来请求数据即可,无需再次带上用户名和密码。springsecurity + 基础不带验证码登录功能的实现。
2023-01-28 23:56:36 4863 3
原创 浅谈Java中equals与==的区别
我们都知道任何我们创建的Java对象都是Object超类(基类)的子类,我们创建的自定义Java对象若没有重写equals方法,我们所使用的equals则自动基础自基类,下面我们来看看jdk8里Object源码中的equals方法。equals:比较两个对象的值是否相等,前提条件是比较的对象重写了equals方法,若没有重写则比较的仍旧是两个对象的内存地址。在测试类test中比较没有重写equals方法时,创建两个属性值都一样的student对象,用equals进行比较。再测试一次,控制台打印true。
2023-01-03 21:56:15 529 1
原创 idea报错Failed to start bean ‘documentationPluginsBootstrapper‘; nested exception ······解决方案
2.报错原因: 这是因为Springfox使用的路径匹配是基于AntPathMatcher的,而Spring Boot 2.6.X使用的是PathPatternMatcher。在学习到尚硅谷的通用权限系统项目时,整合Swagger2,集成knife4j,问题解决:只需要在application.yml配置文件中添加如下配置即可。引入knife4j依赖。
2022-12-26 01:41:21 715
原创 处理nginx报错 CreateDirectory() “F:\······\nginx-1.18.0/temp/client_body_temp“ failed
学习到黑马的redis课程时,启动黑马点评nginx前端项目时,发现无法访问8080端口,在windows的cmd窗口使用线程命令查看8080端口是否存放其他程序占用该端口,结果发现没有任何程序占用,得出结论,nginx没有启动,黑马点评前端工程关闭没有启动,查看了nginx报错日志,发现如下报错信息。在nginx安装目录下的log文件夹中找到error.log日志记录文件。这时访问localhost:8080端口,黑马点评前端页面就加载出来了。
2022-10-10 21:08:54 3033 7
原创 npm run dev 在云服务器上持久运行vue.js程序,退出xshell后也不会停止运行
vue.js应用程序通常运行命令是npm run dev。,还是需要用到nohub这个Linux命令。当前xshell窗口则发现进程随之。,那么如何保证其持久运行,不会因为。xshell窗口造成进程。
2022-10-09 12:52:02 1460
转载 云服务器如何完整地卸载mysql
第二步:逐个卸载上述文件,若不按照顺序卸载,可能会提示“约束依赖”从而导致删除文件失败,所以直接在删除指令后加--nodeps强行删除。第六步:输入 find / -name mysql 指令检验相关文件是否完全删除。至此mysql5.7已经完全卸载干净。第三步:当文件全部删除后,再输入 rpm -qa|grep -i mysql指令检查一遍,确认全部删除。第四步:输入 find / -name mysql 查看相关文件。第五步:输入下列代码删除相关文件。第一步:查看mysql的安装情况。
2022-10-07 16:17:12 2267
原创 springboot启动项目报错 java.lang.NoClassDefFoundError: org/springframework/jdbc/support/JdbcTransactionMa
springboot启动项目报错Casued by: java.lang.NoClassDefFoundError: org/springframework/jdbc/support/JdbcTransactionManager的解决方案:出现这种问题的原因是因为缺少spring-boot-starter-data-jdbc依赖
2022-09-11 16:26:47 2935
原创 使用npm -v指令查看npm版本时报错node:internal/modules/cjs/loader:956 const err = new Error(message)的解决方案
2、删除“C:\Users\Administrator\AppData\Roaming”下的npm和npm-cache;(其中Administrator就是你现在使用的windows电脑刚激活电脑时设置的用户名)当我们在cdm终端中输入npm -v查看安装node.js时一同安装的npm版本号时,报错。如上解决方案即为node.js中npm用不了的解决方法,很暴力有效。直接暴力解决,重装node.js。3、重新安装node.js即可。1、卸载node.js;
2022-09-06 18:36:08 4715 1
原创 springboot整合thymeleaf实现登录跳转(详细)
springboot、springboot整合thymeleaf实现登录跳转(采用重定向)
2022-08-29 19:04:01 8215 4
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人