synchronized和ReentrantLock的区别
synchronized和ReentrantLock的区别 区别 synchronized ReentrantLock 底层实现 JVM内置的C++实现 Java代码,基于AQS框架实现 底层机制 Monitor 基于AQS框架实现 JVM实现 偏向锁、轻量级锁、重量级锁 无 可重入 是 是 可中断 否 lockInterruptibly() 非阻塞获取 否 tryLock() 公平性 非公平 可配置公平/非公平 锁释放 自动释放 手动释放 超时获取锁 不支持 tryLock(timeout) 条件变量 不支持 多个condition 锁状态检查 是 isLocked() 底层原理synchronized的底层原理字节码层面,synchronized会编译成monitorenter和monitorexit指令。monitorenter指令会尝试获取锁,如果锁被其他线程持有,则当前线程会阻塞等待,直到锁被释放。monitorexit指令会释放锁,允许其他线程获取锁。(monitorexit有两个,一个是正常退出,一个是...
JVM相关知识点
JVM相关知识点1. Java中有哪些垃圾回收算法 引用计数法 工作原理:每个对象都有一个引用计数器,当引用指向该对象时计数加1,当引用被解除时,计数减1.当计数为0时,表示当前对象没有引用,可以被回收 优点:实现简单,能处理堆中的所有对象 缺点:无法处理循环引用的情况 标记-清除算法 工作原理:首先遍历堆中的对象,标记出所有存活的对象,清除未标记的对象 优点:实现简单,能处理堆中的所有对象 缺点:标记和清除的过程会产生内存碎片 复制算法 工作原理:将堆中的对象复制到另一个空闲的内存区域,清除原区域的对象 优点:效率高,可以避免碎片产生 缺点:需要额外的内存空间,复制过程会消耗时间 标记-整理算法 工作原理:结合标记-清除算法以及复制算法 先标记所有存活的对象,然后将所有存活的对象向一端移动,清除未标记的对象 优点:减少内存碎片,提高内存的利用率 分代收集 工作原理:将对象分为不同的代,年轻代经常进行垃圾回收,老年代相对较少 2. JVM方法区是否会出现内存溢出重点:jdk1.7前,方法区被实现为永久代,永久代的内存空间是固定的,不能动态扩展.如果加载的类...
关于I/O模型的种类
关于I/O模型的种类知识点速记1.阻塞io:你想喝水。用烧水壶烧水,自己站在边。自己盯着。一旦开了,你把水倒到杯子里面2.非阻塞i0:你烧水,一开烧。你就去打2分钟游戏。然后回来看一下开了没。没开就又去打2分钟游戏。你不在这里等着。直到有一次来它开了。你倒到杯子里面3.IO多路复用:你还是想喝水,但是你找了个专门帮人烧水的邻居。他给很多人烧水。你说我想烧水,他给你烧上,你就跑回家玩游戏了。水开了他就电话打你。你赶紧来拿。但是你要倒在自己杯子里4.信号量:你去烧水房。是自动的,没有人。通知灯和你家门铃是通的,你烧上,人就可以走。烧开了就自动响你门铃,但是有时候客人来了也响门铃。你就搞不清楚到底是啥情况5.异步io:和3类似,还是烧水你最后还要自己倒杯子里面,吹凉了喝。这里就是他给你倒好,吹凉了。然后一喊你。你来了立马就喝上了 同步阻塞IO(BIO)线程调用read时,如果数据还未到来,线程会一直阻塞等待 优点:实现简单,调用后等待数据到达即可 缺点:每个连接都需要一个线程,即使数据还没到达,线程也会被占用,导致资源浪费,不适合高并发场景 同步非阻塞IO(NIO)rea...
Doris相关知识点
Doris相关知识点1. Doris的使用CREATE TABLE ods_sit.tbl_cust_outbound_collect_order ( tenant_id INT, collect_date DATE, waybill_no VARCHAR(64), receiver_city_code VARCHAR(64), next_stop_center_name VARCHAR(128), -- ... 其他列)ENGINE=OLAPDUPLICATE KEY(tenant_id, collect_date, waybill_no)PARTITION BY RANGE (collect_date) ( PARTITION p20251120 VALUES LESS THAN ('2025-11-21'), PARTITION p20251121 VALUES LESS THAN ('2025-11-22') -- 可启用动态分区自动维护)DISTRIBUTED BY HASH(waybill_no) BUCKET...
Redis的hash是什么
Redis的hash是什么重点Redis的hash是一种键值对集合,可以将多个字段和值存储在同一个键中。 适合存储小数据,用哈希表实现,能够在内存中高效存储和操作 支持快速的字段操作(crud),适合存储对象的属性 底层实现 Redis6及以前,hash的底层是压缩列表加哈希表的数据结构 Redis7及以后,hash的底层是紧凑列表加哈希表的数据结构 为什么不直接用哈希表,而是先使用紧凑列表和压缩列表 内存占用方面:压缩列表和紧凑列表都是紧凑的内存结构,他们没有像哈希表那样存在额外的指针开销。哈希表为了维持快速查找特性,内部采用链表法解决哈希冲突,每个哈希桶都会带有指针,这使得内存占用开销较大。另外两个数据结构主要通过将数据存储在一块的连续内存(CPU缓存友好),从而使内存占用最小。 性能方面: 哈希表的访问速率是O(1),但那是没有涉及链表操作的情况下,因为我们知道Hash解决哈希冲突是通过链地址法结局的,链表的遍历由于是在内存中为散落的形式,不像其他两个是连续数组存储,所以性能不一定比压缩列表和紧凑列表快。 压缩列表和紧凑列表查找key的效率是类似的,时间复杂度都是O...
MySQL的主从同步机制
MySQL的主从同步机制MySQL主从复制类型 异步复制:主库将binlog事件异步发送给从库,从库根据事件进行回放。 半同步复制:主库等待至少一个从库确认接收到数据,然后返回确认给客户端。 同步复制:主库等待所有从库确认接收到数据,然后返回确认给客户端。 异步复制异步复制是MySQL默认的复制类型 主库: 接收到提交事务请求 更新数据 将数据写入binlog 给客户端响应 主库推送binlog变更事件到从库 从库接收到事件去主库拉取数据 从库: 由IO线程将同步过来的binlog写入relay log中 由SQL线程从relay log重放事件,更新数据 给主库返回响应 简单来说就是:主库提交事务会写binlog,主库dump线程会监听binlog日志的变更,如果binlog有更新则推送更新事件给从库,从库接收到事件后拉取数据,会有一个IO线程将其写入到relay log中,从库再慢慢消化,由sql线程重放更新数据 但是异步复制由数据丢失风险。比如:数据还没同步到从库,主库就给客户端响应,然后主库挂了,此时从库晋升为主库的话,数据就会丢失。
MySQL调优
MySQL调优重点首先观察慢SQL,利用explain分析查询语句的执行计划 合理利用索引,利用联合索引进行覆盖索引的优化,避免回表查询,减少一次查询和随机IO 避免 select * 避免在SQL中进行函数计算等操作 避免使用%LIKE,导致全表扫描 注意联合索引最左匹配原则 不要对五索引字段进行排序操作 连表查询注意不同字段的字符集是否一致,避免字符集转换导致的全表扫描 慢SQLMYSQL自带日志记录,默认关闭通过set global slow_query_log='ON';即可开启通过set global long_query_time=1;设置慢查询时间,默认10s(当前1秒)
MySQL中如果发生死锁该如何解决
MySQL中如果发生死锁该如何解决重点自动检测与回滚MySQL自带死锁检测机制(innodb_deadlock_detect),当检测到死锁时,数据库会回滚其中一个事务,来解除死锁。通常会回滚事务中持有最少资源的那个。 手动kill通过 KILL <process_id> 来手动kill掉一个事务。 如何查看死锁日志通过 SHOW ENGINE INNODB STATUS 来查看死锁日志。 ------------------------LATEST DETECTED DEADLOCK------------------------170219 13:31:31*** (1) TRANSACTION:TRANSACTION 2A8BD, ACTIVE 11 sec starting index readmysql tables in use 1, locked 1LOCK WAIT 2 lock struct(s), heap size 376, 1 row lock(s)MySQL thread id 448218, OS thread handle 0x2abe5...
MySQL锁的种类
MySQL锁的种类共享锁与排他锁其实MYSQL中,锁可以分为两大类 S锁(共享锁) X锁(排他锁) SS不互斥,X与任何锁都互斥 SELECT … LOCK IN SHARE MODE 这种读取需要对记录上S锁SELECT … FOR UPDATE 这种读取需要对记录上X锁 一般情况下,为了高性能和高并发需求,我们不会使用表锁。平日里UPDATE和SELECT要用也是用行锁。 表锁一般会用在DDL语句上,比如ALTER TABLE时,应该锁定整个表,这个时候,元数据锁就出现了 元数据锁(MDL)元数据锁也分为读锁和写锁当一个事务需要读取表中的元数据时,会获取读锁但是当一个事务要修改元数据时,会获取写锁 但是业务中用到表锁,肯定会与行锁产生冲突。InnoDB加表锁时,怎么判断表中是否有行锁呢? 意向锁于是意向锁诞生了 IS 共享意向锁 IX 排他意向锁 这两个锁是表级别的锁,当需要对表中某条数据上S锁时,先在表上加一个IS锁,表明此时表中有S锁。X锁也会在表上加上一个IX锁,表明此时表中有X锁。 这样操作之后,如果要加表锁,直接看看表上面有没有IS或者IX锁。 因此IS和I...
Redission实现分布式锁的原理
Redission实现分布式锁的原理重点: 锁的获取:使用Lua脚本,利用exists+hexists+hincryby命令来保证只有一个线程能获取到锁。同时,通过pexpire命令为锁设置过期时间,防止死锁 锁的续期:看门狗,自动实现所得续期功能,1/3的过期时间为续期时间 锁的释放:通过Lua脚本,利用hexists+del确保只有持有锁的线程才能释放锁,防止误释放锁。同时利用publish命令,广播唤醒其他等待的线程 可重入锁:持有锁的线程可以多次获取同一把锁而不会被阻塞。具体是利用了Redis的hash结构。hash中key为线程id,如果重入则value+1,释放则value-1,减到0则为释放,进行del操作
