自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(26)
  • 收藏
  • 关注

原创 手写一个线程池

自己手动写一个线程池的必要条件需要先了解我们使用的线程池的功能。为什么会有线程池?这是为了减少线程创建和销毁的开销。复用线程的目的。为了达到这个目的。预计方案是:需要一个存放任务的队列,主线程相当于生产者,在这个队列里面push任务,启动几个核心线程一直消费这个队列,然后执行其中的任务。

2024-03-12 00:08:42 414 1

原创 ConcurrentHashMap底层原理

1、并发结构不一致,1.7是segement+数组+链表,1.8是数组+链表+红黑树2、锁机制不一样,1.7是ReentRantLock机制对segement加锁,而1.8则通过CAS和Synchronized对表头进行加锁3、扩容方式不一样,1.7是对segement内部的表进行扩容,并且遍历oldtable,然后将数据迁移到新表中,而1.8使用多线程进行迁移,将旧表拆分成多个任务,分配给多个线程进行迁移。

2024-03-10 16:39:06 891

原创 HashMap的底层实现

1、结构不一致,1.7是数组+链表,1.8是数组+链表+红黑树2、扩容时机,1.7是在扩容之后插入的数据,1.8是插入之后进行扩容3、插入方式不一样,1.7是头插入方法,使得链表数据在新表中是倒置的,1.8则是尾插入法,使得在新表中的数据是和老表中的插入顺序是一致的4、并发问题,1.7 头插入方法会导致在并发的时候死循环,1.8解决了此问题,使用尾插入方法,但是在扩容的时候先对table进行赋值,使得并发get的时候,获取到空值。

2024-03-09 23:58:48 843

原创 java之ReentrantLock

在讲RentrantLock之前需要先讲一下AQS和LockSupport,因为rentrantLock底层是用AQS实现的,而AQS中获取阻塞和唤醒底使用LockSupport实现的。

2024-02-03 23:52:10 993

原创 java之Synchronized

为什么需要synchronized?在我们并发编程中,处理公共数据时,需要考虑多个线程同时处理导致的问题,这时候需要用到synchronized来修饰方法,保证其原子性。

2024-02-03 21:44:37 918

原创 java之CAS

cas顾名思义是比较交换,实现了并发安全特性的原子性,是基于硬件平台的汇编指令,也就是说基于硬件实现的,通过比较预期的值是否和内存中值是否一致,如果一致则更新,如不一致则重新获取内存的值进行比较。和其他实现原子性的方式不一样的是此方式不需要加锁,大大提高了执行效率,解决了加锁释放锁导致的上下文切换的问题。

2024-01-28 14:55:43 882

原创 java之voliate

线程安全的三大特性:原子性,可见性,有序性,但是voliate只是具备可见性和有序性,不具备原子性。

2024-01-27 01:08:49 1006 2

原创 mysql之MVCC

mvcc作用在于解决并发条件下,读写冲突的问题。一般用于RC和RR隔离级别,解决脏读和不可重复读的问题。(1)当前读读取的是记录的最新版本,读取时还要保证其他事务不能修改当前记录,会对读取的记录进行加锁。对于我们日常的操作,如:select ... lock in share mode(共享锁),select ... for update、update、insert、delete(排他锁)都是一种当前读。(2)快照读。

2024-01-21 00:43:29 861

原创 mysq之事务

事务是一组操作的集合,事务将一组操作联系在一起,要么一起提交,要么一起回滚,即操作要么成功,要么失败。

2024-01-20 22:19:38 349

原创 mysql之InnoDB存储引擎

在mysql中,表数据在后台是怎么保存的呢?例如stu表为例子,mysql的表数据存储路径是C:\ProgramData\MySQL\MySQL Server 8.0\Data\itcast\stu.idb.而此idb的存储结构是怎么样的呢?idb文件中存放的是索引、表、字段和相关元信息。

2024-01-20 21:00:56 789

原创 mysql之锁

在任何语言中,当进程中或者线程中存在并发访问同一个资源时,为了保证数据一致性,必须对共享资源添加相应的锁。mysql亦是如此。mysql属于磁盘中的共享资源,任何客户端都可以去相应DML和DDL操作。所以锁对于mysql而言至关重要。mysql中锁,按照粒度划分,可以分为以下三类:全局锁:锁定数据库中所有的表。表级锁: 每次操作都锁住整张表。行级锁:每次操作锁住对应的行数据。

2024-01-18 13:05:11 958 1

原创 mysql之SQL优化

insert:一般我们使用insert都是一条语句一条语句插入,但是如果数据量比较大的情况下,需要使用一定的优化手段进行插入。(1)优化方案一(2)优化方案二:手动事务插入commit;(3)优化方案三:主键顺序插入大于乱序插入在连接客户端时 使用loal-infile设置一个全局参数local_infile为1,开启从本地加载文件导入数据的开关执行load指令将准备好的数据,加载到表结构中。

2024-01-14 22:37:42 776 1

原创 mysql之explain

1、联合索引按照最左匹配原则,在写select语句时要主要索引的使用,防止索引失效。2、索引失效的情况有:范围查找,索引列运算,字符串不加引号,模糊查询,or连接条件,数据分布影响。

2024-01-14 00:01:33 877 1

原创 mysql之索引类型

在mysql数据库中,索引类型分为:(1)主键索引(2)唯一索引(3)普通索引(4)全文索引1.1 主键索引此是针对表中主键创建的索引,具有唯一性,只能有一个。id int primary key auto_increment comment '主键',1.2 唯一索引避免同一个表中某数据列的值重复的,可以有多个。1.3 普通索引一般的索引 ,值可能会重复,也可以有多个,多个的时候一般叫做联合索引1.4 全文索引。

2024-01-11 23:58:02 322

原创 redis之分布式锁

我们知道很多电商都会有秒杀的业务,如果只有一台服务器承载不了同一时间千万用户的业务,所以需要多台服务器,单台业务中我们只操作一个数据库,对数据的库存做想要的删减和增加用户的秒杀信息。解决并发的场景使用的是synchronized锁,但是分布式集群的情况下,这个锁起不到作用,并且会出现以下超卖的情况所以需要依赖于redis的分布式锁。上述存在的问题是会存在误删锁的情况,如果两个线程,其中一个线程执行业务时间比较长,超过了其过期时间,则redis自动就会释放锁。为了做到同步,则使用lua脚本的方式来释放锁。

2024-01-10 00:27:17 639 1

原创 java之线程基础

(1)new(3)blocking synchronized或者lock使用出现的状态(4)waiting wait notify出现的状态(5)time waiting sleep出现的状态一般在开发应用中,利用jstack打印的线程信息显示上述状态,这些状态可以帮忙定位相应的问题。

2024-01-09 00:43:29 374

原创 mysql日志实践

上述日志,binlog和慢查询日志可以很好的帮忙开发人员定位相应的sql问题,binglog可以帮忙在生产环境中故障后更好的恢复数据,错误日志可以帮忙开发人员定位mysql无法启动的原因。

2024-01-08 00:16:52 375 1

原创 mysql 主从复制

上述主从复制,如果要想在生产中使用,则需要配合keepalive实现,达到主挂了,从能接替主干活。

2024-01-07 23:50:41 385 1

原创 集合中最常见的问题:hashmap的原理

为了获取高的查询效率,类似于mysql一样,当数据量很大的情况下,需要加索引,而索引的数据结构则是红黑树。我们在获取查询效率的同时,需要付出插入和删除难度和复杂度的代价。当然是key-value的形式,key是用数组来保存,那value则是在1.7和1.8是不一样的,1.7是链表。1.8则是长度在8个以内则是链表,长度超过8个则是红黑树。这是由于链表的长度是符合泊松分布,当长度等于8时,出现的概率为千万分之一,所以正常情况下map不会出出现转换成树的情况。这是由于链表的好处是插入和删除,而查询需要全遍历。

2024-01-05 09:00:35 310 1

原创 秒杀中为什么要用redis

我们知道很多电商都会有秒杀的业务,如果只有一台服务器承载不了同一时间千万用户的业务,所以需要多台服务器,单台业务中我们只操作一个数据库,对数据的库存做想要的删减和增加用户的秒杀信息。解决并发的场景使用的是synchronized锁,但是分布式集群的情况下,这个锁起不到作用,并且会出现以下超卖的情况所以需要依赖于redis的分布式锁。但是上述存在的问题是会存在误删锁的情况,如果两个线程,其中一个线程执行业务时间比较长,超过了其过期时间,则redis自动就会释放锁。(1)、使用的是setnx 增加锁。

2023-10-12 00:28:59 39 1

原创 遇到tomcat假死问题啦

后来现场回复说有一个接口超时后,慢慢的出现一连串的超时。这时就去查看这个接口为啥超时,具体查看详细代码,果然发现问题。这是由于在现场特定场景下,此接口出现死循环,调用此接口是定时调用的,随着时间的推移,tomcat线程越来越多超过它的最大线程数。最近遇到一个网上问题,听现场的回复说界面卡死,所有请求都超时,然后就重启了tomcat。都重启tomcat了,还让我去定位为啥。于是让他们收集日志回来。查看access日志,确实在某个时间段后就不接收请求了。然后在项目日志里面查看是否有oom或者其他猫腻的日志。

2023-10-08 23:49:50 67 1

原创 欧拉版本tmp/hsperfdata_root下面的java进程文件不会实时更新,有人知道这个问题吗?

这是由于在tmp/hsperfdata_root目录下保存了java进程id文件,java进程启动时会在这个目录创建这个id文件,并且运行过程中,jvm配置了性能数据更新任务,每50s会更新一次此进程id文件,但是在欧拉版本环境下此进程id文件却不会更新,导致系统自带的systemd-tmpfiles-clean服务会定时清理没有被更变的文件。要解决上述问题,需要在systemd-tmpfiles-clean的配置文件中排除java进程文件即可。但是欧拉版本下只要启动的那一刻才更新,后面不会更新。

2023-10-08 23:34:28 387 3

原创 mysql之索引

mysql索引

2023-09-02 00:17:11 50 1

原创 select poll epoll这几个区别在哪里

3、epoll模型,内部使用的结构是红黑树,数节点中不仅包含fd还包含监听事件,当客户端触发io读写事件后,则监听事件会触发回调,内核就会在就绪队列中创建一个节点包含刚刚的fd和监听事件,而netty则遍历这个就绪队列。真的响应回调是直接在应用层面进行回调,window中使用的iocp是真正的aio,异步io回调。2、poll模型,内部使用的数据结构是链表,比select有优势的地方在于没有长度限制,插入和删除效率比数组高,但是和select模型一样,也是使用轮询的方式遍历链表,查询是否有读写io事件。

2023-08-22 23:16:02 37 1

原创 mysql进阶之存储引擎

如果对事务的完整性有比较高的要求,在并发条件下要求数据的一致性,数据除了插入和查询之外,还支持更新和删除,所以在这种条件下 选择INNODB比较合适。MyISM: 如果应用是以读操作和插入为主 ,只有少量的更新和删除操作,并且对事务的完整性和一致性要求不高,则选择使用这个存储引擎, 一般用这个引擎的很少 如果需要 则建议效率更快的。②. InnoDB引擎, 支持行锁和表锁, 而MyISAM仅支持表锁, 不支持行锁。③. InnoDB引擎, 支持外键, 而MyISAM是不支持的。.frm–表结构的文件。

2023-08-16 21:40:06 30 1

原创 go语言中go mod和java中的maven对比

go语言中go mod和java中的maven对比

2023-08-16 21:37:18 309 1

空空如也

空空如也

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

TA关注的人

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