- 博客(51)
- 收藏
- 关注
原创 多线程与锁
Java多线程与并发编程总结 线程通信:notify()随机唤醒一个等待线程,notifyAll()唤醒所有等待线程。wait()释放锁并进入等待,需外部唤醒;sleep()不释放锁,时间到自动唤醒。 锁机制: synchronized:基于Monitor实现,含偏向锁、轻量级锁(CAS)、重量级锁三级升级,保证原子性但性能受限。 ReentrantLock:基于AQS实现,支持公平/非公平锁、可中断、超时等特性,需手动释放锁。 线程安全: CAS:乐观锁思想,通过Unsafe类调用底层指令。 volati
2025-06-11 14:47:55
1435
原创 SpringBoot
进行自动配置,如:添加了spring-boot-starer-web依赖,会自动添加Tomcat和SpringMVC的依赖,SpringBoot会对Tomcat和SpringMVC进行自动配置。的思想,可以让开发人员不必在配置与逻辑业务之间进行思维的切换,全身心的投入到逻辑业务的代码编写中,从而大大提高了开发效率,一定程度上缩短了项目周期。,并且尽可能的减少一切 xml 配置,做到开箱即用,迅速上手,让我们关注与业务而非配置。:解决了整合框架或者技术的配置文件过多,集合了所有的约定的默认配置。
2025-06-11 09:00:00
1142
原创 SpringMVC 框架
SpringMVC 是一个基于 Java 的实现了 MVC 设计模式的请求驱动类型的轻量级Web框架,通过把model,view,controller分离,将web层进行职责解耦,把复杂web应用拆分成逻辑清晰的几部分,简化开发,减少出错,方便组内开发人员之间的配合。在我看来,SpringMVC就是将我们原来开发在servlet中代码拆分了,一部分有mvc完成,一部分由自己完成。,它的实现类支持不同的视图类型,如jsp,free marker,pdf等等。接口),并实现里面的异常处理方法,然后将。
2025-06-10 09:30:00
954
原创 Spring框架
这是多个线程会并发执行该请求对应的业务逻辑(成员方法),如果该处理逻辑中有对该单例状态的修改(体现为该单例的成员属性),则必须考虑线程同步问题。spring的配置文件中配置了类的字节码位置及信息,容器生成的时候加载配置文件识别字节码信息,通过反射创建类的对象。也可以放在方法上:表示自动执行当前方法,如果方法有参数,会自动从IOC容器中寻找同类型的对象给参数传值。中,(key是bean的名字,value是bean的信息,包括全限定名等等),没有数据库的事务支持,spring是无法提供事务功能。
2025-06-10 09:00:00
636
原创 MYSQL
先分页查询数据的id字段,确定了id之后,再用子查询来过滤,只查询这个id列表中的数据就可以了,因为查询id的时候,走的覆盖索引,所以效率可以提升很好。非聚簇索引(二级索引):指的是数据与索引分开存储,B+树的叶子节点保存对应的主键,可以有多个,一般我们自定义的索引都是非聚簇索引。简单的select(不加锁)就是快照读,快照读,读取的是记录数据的可见版本,有可能是历史数据,不加锁,是非阻塞读。,在原B+树的基础上,增加了一个指向相邻叶子节点的链表指针,就形成了带有顺序指针的B+树,提高区间访问的性能。
2025-06-09 09:34:41
1279
原创 美团面经:Threadlocal(线程局部变量的原理)->内存泄漏问题->垃圾回收机制
把所有的引用关系看作是一张图,从一个节点GC ROOT(线程栈的本地变量、静态变量、本地方法栈的变量等等)开始,寻找对应的引用节点,找到这个节点后,继续寻找这个节点的引用节点,当所有的引用节点寻找完毕之后。剩余的节点则被认为是没有被引用到的节点,既可以当作垃圾。在我们的ThreadLocal类有一个静态内部类,叫做ThreadLocalMap,用键值对的形式存储每一个线程的变量副本,ThreadLocalMap中元素的key为当前ThreadLocal对象,而value对应线程的变量副本。
2024-05-16 16:05:59
1320
原创 git常用命令
git branch -d 删除分支。(将当前分支变基到master)git branch 创建分支。10. 问题排查。1. 仓库基础操作。3. 远程仓库操作。6. 子模块管理。8. 配置管理。9. 高级操作。4. 撤销与重置。5. 标签管理。7. 日志与对比。
2025-06-17 09:00:00
1201
原创 Linux常用命令
b 以批处理模式运行(非交互式/非全屏) 常配合-n使用,输出可重定向到文件,如top -b -n 3 > /tmp/top.log。◦ 选项:-g指定用户的组,不指定-g,会创建同名组并自动加入,指定-g需要组已经存在,如已存在同名组,必须使用-g。· -r,被压缩的包含文件夹的时候,需要使用 -r 选项,和 rm、cp 等命令的 -r 效果一致。选项:-9表示强制关闭进程。◦ 选项:-r,删除用户的HOME目录,不使用-r,删除用户时,HOME目录保留。默认不显示出来,需要-a选项才可查看到。
2025-06-17 08:00:00
1667
原创 SystemUI
onCreate()中注册ACTION_BOOT_COMPLETED广播,应用成功启动后便可执行SystemUIService服务,然后再调用SystemUIService中onCreate,通过获取应用的Application实例SystemUIApplication对象,调用startServiceIfNeeded。这是VolumeControllerImpl的实现代码,主要实现对VolumeU控制,例如上图中的volumeChanged()响应系统音量变化事件(如用户按音量键或程序调音)。
2025-06-16 14:16:30
1007
原创 Passwords & accounts
SetNewPasswordController SetNewPasswordActivity 的业务逻辑控制器,负责根据设备硬件支持和管理策略,决定用户在设置新密码时是否需要配置生物识别(指纹/人脸),并引导至对应的密码设置界面。它的主要职责是根据设备策略、应用请求、用户类型等因素,确定哪些屏幕锁定类型(如PIN、图案、密码等)对用户可见且可用。BiometricFragment 是一个封装生物识别认证流程的 Fragment管理生物识别(如指纹、面部识别)和设备凭证(如 PIN 码、密码)的验证过程。
2025-06-16 14:04:28
734
原创 JWT&杂七杂八
私有声明是提供者和消费者所共同定义的声明,一般不建议存放敏感信息,因为base64是对称解密,意味着该部分信息可以归类为明文信息。公共的声明可以添加任何的信息,一般填加用户的相关信息或其他业务需要的必须信息。如果此时服务B发送故障,那么这个业务会阻塞占用我们的线程,但是最多只占用我们的10个线程,我们。检查JWT ,是用于对应用程序上的用户进行身份验证的标记。微服务调用链路中的某个服务故障,引起整个链路中的所有微服务都不可用,这就是雪崩。,避免耗尽整个tomcat的资源,因此也叫线程隔离(资源浪费的情况)
2025-06-14 13:00:00
604
原创 RocketMQ&Kafaka
消费者组是Kafka独有的概念,如果面试官问这个,就说明他对此有一定了解的。我先给出标准答案:1、定义:即消费者组是Kafka提供的可扩展且具有容错性的消费者机制。2、原理:在Kafka中,消费者组是由多个消费者实例构成的组。多个实例共同订阅若干个主题,实现共同消费。同一个组下的每个实例都配置由相同的组ID,被分配不同的订阅分区。当某个实例挂掉的时候,其他实例会自动地承担起它负责消费的分区。此时,又有一个小技巧给到你:消费者组的题目,能够帮你在某种程度下掌握面试的方向。
2025-06-14 10:00:00
714
原创 RabbitMQ
摘要:RabbitMQ通过消息持久化、持久化队列、生产者/消费者确认机制保证消息不丢失;利用唯一ID检查、Redis分布式锁解决消息重复消费;死信交换机和TTL实现延迟队列功能;针对消息堆积问题,可增加消费者、使用惰性队列(直接存磁盘)提高处理能力;高可用方案包括普通集群(共享元数据)、镜像集群(主从同步)和基于Raft协议的仲裁队列(强一致性)。其中镜像集群存在主从切换时的数据丢失风险,而仲裁队列能提供更强的一致性保障。
2025-06-13 10:00:00
955
原创 MongoDb
MongoDB是一款开源的文档型非关系数据库,采用BSON(二进制JSON)格式存储数据,具有高性能、高可用和可扩展的特点。其数据层次结构为文档→集合→数据库,文档相当于关系型数据库中的一行记录。MongoDB默认包含admin、local和config三个特殊数据库。相比MySQL等关系型数据库,MongoDB更适合实时数据操作、网站数据存储、缓存层构建、大尺寸低价值数据存储、高扩展性场景以及对象/JSON数据存储等业务场景。它支持多种数据类型,包括数值、字符串、日期、数组等,特别适合需要灵活数据模型的应
2025-06-13 08:00:00
850
原创 Nginx
此时,客户端就可以向nginx发起连接了。,服务就近提供,达到更好的访问质量,减少后台服务器大并发压力。服务器,及电子邮件代理服务器,同时也是一个非常高效的。首先,nginx在启动时,会解析配置文件,得到。,与nginx建立好一个连接后,此时,某一个。,如http模块与客户端进行数据的交换。,此时代理服务器对外就表现为一个。给internet上请求连接的。给各服务器中,负载均衡主要解决。,到此,一个连接就寿终正寝了。,为了从原始服务器取得内容,,提供了一个队列,排队解决。,然后在nginx的。
2025-06-12 09:38:59
270
原创 Redis
当其他主节点ping一个主节点A时,它的底层主要是先去初始化一个比较大的数据,里面存放的是二进制0或1.在一开始都是0,当一个key来了之后经过3次hash计算,模于数组长度找到数据的小标,然后将数组中的0改为1,这样的话,三个数组的位置就能标明一个key的存在。查找过程也是一样的。缺点是布隆过滤器有可能产生一定的误判,我们一般可以设置这个误判率,大概不会超过5%,其实这个误判是必然存在的,要不就得增加数组的长度,其实是很划算的了,5%以内的误判率一般的项目也能接收,不至于高并发下压倒数据库。
2025-06-12 09:00:00
957
原创 SpringCloud
目前微服务微服务架构主流的是 SpringBoot+Dubbo 和 SpringBoot+SpringCloud81的架构模式. 综上, 无论是 SOA 还是微服务, 都需要进行服务调度, 目前主流的服务调度室RPC和HTTP 两种协议, 而 Dubbo 基于 RPC 的远程调度机构, SpringCloud 是基于Rest 风格(基于 http 协议实现的)的 Spring 全家桶微服务服务治理框架. 说到这里也可以继续说下Dubbo 和 SpringCloud 的区别。SOA:面向服务的架构。
2025-06-11 09:15:00
875
原创 Mybatis框架
MyBatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。MyBatis可以使用简单的XML或注解来配置和映射原生类型、接口和java的POJO为数据库中的记录。,resultMap要配置一下表和类的一一对应关系,所以说就算你的字段名和你的实体类的属性名不一样也没关系,都会给你映射出来。需要在setting全局参数中配置二级缓存,如下conf.xml配置。mybatis在处理${}时,就是把${}替换成变量的值。的,如果你配置了二级缓存,那么。如果数据库结果集中的。的,但是可以手动开启。
2025-06-09 09:40:40
900
原创 Web基础网络知识
的,每个用户都会产生一个session。假如并发访问的用户十分多,会产生十分多的session,耗费大量的内存。),是一种创建交互式、快速动态网页应用的网页开发技术,无序重新加载整个网页的情况下,能够更新部分网页的技术。三次握手的目的是建立可靠的通信信道,说到通讯,简单来说就是数据的发送与接收,而三次握手最主要的目的就是。,但处于对服务器端的性能考虑,session内不要存放过多的东西,并且设置session删除机制。,别有用心的人可以分析存放在本地的cookie并进行cookie欺骗,所以它。
2025-06-08 09:00:00
518
原创 JAVA线程池
在实际使用中,线程时很占用系统资源的,如果对线程管理不完善的话很容易导致系统问题。因此对线程管理不完善的话很容易导致系统问题。因此,在大多数并发框架中都会使用。,相对而言存在一定的风险,因为我们提交的时候根本不知道这个任务会被丢弃,可能造成数据丢失。,让你感知到任务被拒绝了,我们可以根据业务逻辑选择重试或者放弃提交等策略。,而是将某些任务回退到调用者,让调用者去执行它。原理:遍历线程池中的所有线程,然后依次中断。,它也存在一定的数据丢失风险。(重复此过程),通常是。关闭线程池,可以通过。
2025-06-07 13:28:06
643
原创 多线程常用知识
如果所有线程都在此对象上等待,则会选择唤醒其中一个线程,选择是任意的,并在对实现做出决定时发送,线程通过调用其中一个wait()方法,在对象的监视器上等待,直到当前的线程放弃此对象的锁定,才能继续执行被唤醒的线程,被唤醒的线程将以常规方式与该对象上主动同步的所有线程进行竞争。线程相关的基本方法有wait,notify,notifyAll,sleep,join,yield等。join()方法,等待其他线程终止,在当前线程中调用一个线程的join()方法,则。,是cpu调度的分派的基本单位,是比。
2025-06-07 13:27:37
658
原创 JVM解析
设置每个线程的大小。标记复制:将可用的内存分为两部分,标记过程相同,清理过程是将非垃圾挪到另一边,把原有一边全部删除,优点 解决垃圾多 和空洞问题 但是内存利用率不是很高。核心思想就是,堆中的对象每被引用一次,则计数器加1,每减少一个引用就减1,当对象的引用计数器为0时可以被当作垃圾收集。java语言规范并没有明确的说明JVM使用哪种垃圾回收算法,但是常见的用于【发现垃圾】的算法有两种,引用计数算法和根搜索算法。Java中可作为GC Root的对象有()线程栈中的本地变量,静态变量,本地方法栈中的变量。
2025-06-07 13:25:31
1344
原创 JAVA-集合
list用了toArray转数组后,如果修改了list内容,数组不会影响,当调用了toArray以后,在底层是它进行了数组的拷贝,跟原来的元素就没啥关系了,所以即使list修改了以后,数组也不受影响。list会受到影响,因为它的底层使用的Arrays类中的一个内部类ArrayList来构造的集合,在这个集合的构造器中,把我们传入的这个集合进行了包装而已,最终。它按照先进后出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候先栈顶开始弹出数据(最后一个数据被第一个读出来)
2025-06-07 12:48:17
831
原创 安卓Setting源码-搜索
初始化后,数据存储在以下路径:/data/user_de/0/com.android.settings/databases/search_index.db。在对其进行循环遍历解析出所有 BasePreferenceController 实例,用于动态管理 Preference 的展示逻辑和搜索索引生成。跳转后是 search_bar.xml 或者是search_bar_two_pane_version.xml。在 Android 设置应用中,搜索索引通常在 首次进入搜索界面时自动初始化。
2025-06-07 09:00:00
1755
原创 Preference基础构件类
一、Preference 是Android app中重要的控件之一,Settings 模块大部分都是通过Preference 实现的.二、常用Preference控件如下:Preference 控件对应 View 控件控件功能含义PreferenceTextView基础文本项,用于显示简单信息(不可编辑)。CheckBox复选框选项,保存布尔值(true/falseEditText弹出对话框输入文本,保存字符串值。弹出列表选择项,保存选定项的键值对(如。
2025-06-06 09:00:00
600
原创 Android Settings 数据库生成、监听与默认值配置
在SetttngsProvider的启动过程中,会创建数据库,把默认设置的数据值写入数据库,然后将数据库中的数据全部迁移到xml文件中然后为了通过Settings.java对使用SettingsProvider进行了封装。
2025-06-05 15:37:07
1309
原创 MTKSettings安卓源码解析-界面
TopLevelSettings是 Android 设置应用的 主界面核心 Fragment,继承自 DashboardFragment,布局文件res/xml/top_level_settings.xml,用于展示一级菜单项,比如网络、声音、显示等。getCategoryKey从DashboardFragmentRegistry的PARENT_TO_CATEGORY_KEY_MAP中取得CategoryKey的值,PARENT_TO_CATEGORY_KEY_MAP是一个Map类型的变量。
2025-06-05 15:29:14
1116
原创 安卓四大组件&数据存储&Handler
activity存在”运行中,暂停,停止,销毁‘这四种状态,当activity存在栈顶的时候就是运行中,此时用户可以对其进行正常的交互,当activity被另一个透明的activity或者不是全屏的activity挤下栈顶后,就处于暂停状态,此时我们原本的activity依旧可见数据依然保持。SharedPreferences是Android的一个轻量级存储工具,它采用的存储结构是Key-Value的键值对方式,类似于Java的Properties,二者都是把Key-Value的键值对保存在配置文件中。
2025-06-05 11:21:50
1219
原创 Hashmap 和 hashtable ConcurrentHashMap 区别
HashTable使用的是Synchronized关键字修饰,ConcurrentHashMap是JDK1.7使用了锁分段技术来保证线程安全的。JDK1.8ConcurrentHashMap取消了Segment分段锁,采用CAS和synchronized来保证并发安全。ConcurrentHashMap中的synchronized只锁定当前链表或红黑树的首节点,只要hash不冲突,就不会产生并发,效率有提示N倍。ConcurrentHashMap底层是数组+链表/红黑树。
2024-08-20 15:59:34
382
1
原创 MYSQL如何实现事务?
redo log日志记录的是数据页的物理变化,服务宕机可用来同步数据,而undo log不同,它主要记录的是逻辑日志。当事务回滚的时候,通过逆操作来恢复数据,若删除一条数据,就会在undo log日志文件中新增一条delete语句,如果发生回滚则执行逆操作。
2024-08-16 13:44:43
1739
原创 JVM-类加载器、双亲委派模型
由于是双亲委派机制,java.lang.String的在启动类加载器得到加载,因为在核心jre库中有其相同名字的类文件,但该类中并没有main方法。类从加载到虚拟机中开始,直到卸载为止,它的整个生命周期包括了:加载、验证、准备、解析、初始化、使用和卸载这7个阶段。加载某一个类,先委托上一级的加载器进行加载,如果上级加载器也有上级,则会继续向上委托,如果该类委托上级没有被加载,子加载器尝试加载该类。如果加载的类在上级找到,则子加载器不用加载,例如String类。对类的静态变量,静态代码块执行初始化操作。
2024-08-15 01:00:00
439
原创 JVM-运行数据区(堆、栈、元空间)
每个线程运行时所需要的内存,成为虚拟机栈,先进后出每个栈由多个栈帧组成,对应这每次方法调用时所占的内存每个栈帧只能有一个活动栈帧,对应着当前正在执行的那个方法。
2024-08-14 19:09:15
1259
原创 美团一面面经:线程池->事务
在实际使用中 线程是很占系统资源的,因此大多数并发框架都会使用线程池来管理线程1.使用线程池可以重复利用已有的线程执行任务,避免线程在创建时造成消耗2.由于没有线程创建和销毁时的消耗,可以提高系统响应速度3.通过线程可以对线程进行合理的管理,根据系统的承受能力调整可运行数量的大小等首先我们可以大致的了解一下线程池的主要核心原理首先 就是创建一个池子,里面是空,提交任务的时候,池子会创建新的线程对象,任务执行完毕,线程归还给池子。下次再次提交任务时,不需要创建新的线程,直接复用已有的线程即可。
2024-05-16 17:51:44
631
原创 美团一面面经:索引:数据结构B+树->索引失效->索引的设计原则
索引是存储在内存中,为服务器存储引擎为了快速找到记录的一种数据结构。索引的主要作用是加快数据查询速度,提高数据库的性能,核心思想 空间换取时间1.创建唯一性索引,保证数据库表中每一行数据的唯一性2.大大加快数据的检索速度,这也是创建索引的最主要原因3.加速表与表之间的连接,特别是在实现数据的参考完整性方面特别有意义4.在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间。
2024-05-16 17:00:31
848
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅