自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 123. 买卖股票的最佳时机 III 状态机java代码

采用状态机的方式,我们初始化f数组,第一个维度为第几天,当i为0时候为未购买股票,第二个维度为几次购买,当j为1的时候,为购买0次的状态,第三个维度为手中是否持有股票,0为未持有,1为持有股票。

2024-04-24 23:11:31 209 1

转载 java: 错误: 不支持发行版本 7

2、settings里搜 Java compiler,选择问题module的Target bytecode version。1、project structure中检查project、module的SDK版本。

2024-04-13 00:02:20 86

原创 redis对象list

Redis List是一组连接起来的字符串集合。

2024-03-30 00:00:44 536

原创 redis对象String

Redis是key-value存储,key和value在Redis中都被抽象为对象,key只能是。于,EMBSTR下redisObject和SDS是连续的内存,RAW编码下redisObject。String就是字符串,它是Redis中最基本的数据对象,最大为512MB,我们。在于如果重新分配空间,整体都需要再分配,所以EMBSTR设计为只读,任何写。操作之后EMBSTR都会变成RAW,理念是发生过修改的字符串通常会认为是。Raw:原生方式,直接将字符串以字节数组的形式存储,适用于较长的字符串。

2024-03-28 00:16:07 263

转载 BASE 理论

BASE 全称是 Basically Available(基本可用)、Soft State(软状态)和 Eventually Consistent(最终一致性)三个短语的缩写,来自 ebay 的架构师提出。Base 理论是对 CAP 中一致性和可用性权衡的结果,其来源于对大型互联网分布式实践的总结,是基于 CAP 定理逐步演化而来的。其核心思想是:既然无法做到强一致性,但每个应用都可以根据自身的业务特点,采用适当的方式来使系统达到最终一致性。

2024-03-27 22:33:44 25

原创 change buff 与buffer_pool详解

当需要更新一个数据页时,如果数据页在内存中就直接更新,而如果这个数据页还没有在内存中的话,在不影响数据一致性的前提下,InooDB 会将这些更新操作缓存在 change buffer 中,这样就不需要从磁盘中读入这个数据页了。在下次查询需要访问这个数据页的时候,将数据页读入内存,然后执行 change buffer 中与这个页有关的操作。在查询的时候,change buffer是没有办法和innodb_buffer_pool查询一样缓存有数据直接返回的,因为change buffer记录的是修改操作这。

2024-03-17 11:56:16 797

原创 数据库三大范式设计原则

第一范式是最基本的范式。如果数据库表中的所有字段值都是不可分解的原子值,就说明该数据库表满足了第一范式。

2024-03-12 21:29:50 207

转载 java 继承权限相关解析

(1)类的成员的权限修饰符有public,protected,private或default,限定其他对象对该类对象成员的访问权限。(2)class的权限修饰符只可以是public或default。default:类只可以被同一个包内部的类访问。public:类可以在任何地方被访问;

2024-03-06 19:57:17 32

转载 类加载器详解

类加载器是一个负责加载类的对象。ClassLoader 是一个抽象类。给定类的二进制名称,类加载器应尝试定位或生成构成类定义的数据。典型的策略是将名称转换为文件名,然后从文件系统中读取该名称的“类文件”。每个 Java 类都有一个引用指向加载它的 ClassLoader。类加载器是一个负责加载类的对象,用于实现类加载过程中的加载这一步。每个 Java 类都有一个引用指向加载它的 ClassLoader。

2024-03-05 22:36:21 29

转载 jvm的类加载机制

其中,验证、准备和解析这三个阶段可以统称为连接(Linking)。

2024-03-03 23:31:40 22

转载 类文件结构详解

根据 Java 虚拟机规范,Class 文件通过 ClassFile 定义,有点类似 C 语言的结构体。u4 magic;//Class 文件的标志//Class 的小版本号//Class 的大版本号//常量池的数量//常量池//Class 的访问标记//当前类//父类//接口数量//一个类可以实现多个接口//字段数量//一个类可以有多个字段//方法数量//一个类可以有个多个方法//此类的属性表中的属性数//属性表集合。

2024-03-03 10:07:37 27

转载 JVM垃圾回收详解

Serial 收集器 + Serial Old 收集器ParNew 收集器 +Serial Old 收集器ParNew 收集器 + CMS 收集器(老年代))Parallel Scavenge 收集器 + Parallel Old 收集器。

2024-03-03 00:41:43 40

转载 java引用类型总结

弱引用与软引用的区别在于:只具有弱引用的对象拥有更短暂的生命周期。弱引用可以和一个引用队列(ReferenceQueue)联合使用,如果弱引用所引用的对象被垃圾回收,Java 虚拟机就会把这个弱引用加入到与之关联的引用队列中。当垃圾回收器准备回收一个对象时,如果发现它还有虚引用,就会在回收对象的内存之前,把这个虚引用加入到与之关联的引用队列中。软引用可以和一个引用队列(ReferenceQueue)联合使用,如果软引用所引用的对象被垃圾回收,JAVA 虚拟机就会把这个软引用加入到与之关联的引用队列中。

2024-03-02 17:10:06 23

转载 HotSpot 虚拟机对象探秘

我们来详细的了解一下 HotSpot 虚拟机在 Java 堆中对象分配、布局和访问的全过程。

2024-03-02 16:06:36 15

转载 Java内存区域详解

Java 程序员把内存控制权利交给 Java 虚拟机,一旦出现内存泄漏和溢出方面的问题,如果不了解虚拟机是怎样使用内存的,那么排查错误将会是一个非常艰巨的任务。

2024-03-02 11:58:21 32

转载 java线程池相关核心内容_ThreadPoolExecutor 类介绍

ThreadPoolExecutor 类中提供的四个构造方法。我们来看最长的那个,其余三个都是在这个构造方法的基础上产生(其他几个构造方法说白点都是给定某些默认参数的构造方法比如默认制定拒绝策略是什么)。/*** 用给定的初始参数创建一个新的ThreadPoolExecutor。*/public ThreadPoolExecutor(int corePoolSize,//线程池的核心线程数量int maximumPoolSize,//线程池的最大线程数。

2024-03-01 21:38:17 18

转载 java线程池Executor 执行流程解析

Executor 框架是 Java5 之后引进的,在 Java 5 之后,通过 Executor 来启动线程比使用 Thread 的 start 方法更好,除了更易管理,效率更好(用线程池实现,节约开销)外,还有关键的一点:有助于避免 this 逃逸问题。Executor 框架结构主要由三大部分组成:1、任务(Runnable /Callable)执行任务需要实现的 Runnable 接口 或 Callable接口。

2024-02-29 00:25:26 48

转载 Atomic 原子类详解

使用原子的方式更新基本类型AtomicInteger:整型原子类AtomicLong:长整型原子类AtomicBoolean:布尔型原子类上面三个类提供的方法几乎相同,所以我们这里以 AtomicInteger 为例子来介绍。CAS 的原理是拿期望的值和原本的一个值作比较,如果相同则更新成新的值。UnSafe 类的 objectFieldOffset() 方法是一个本地方法,这个方法是用来拿到“原来的值”的内存地址。

2024-02-28 09:58:05 35

转载 java并发容器之线程安全的queue

Java 提供的线程安全的 Queue 可以分为阻塞队列和非阻塞队列,其中阻塞队列的典型例子是 BlockingQueue,非阻塞队列的典型例子是 ConcurrentLinkedQueue,在实际应用中要根据实际需要选用阻塞队列或者非阻塞队列。

2024-02-28 09:34:13 35

转载 java并发容器CopyOnWriteArrayList解析

JDK1.5 引入了 Java.util.concurrent(JUC)包,其中提供了很多线程安全且并发性能良好的容器,其中唯一的线程安全 List 实现就是 CopyOnWriteArrayList。

2024-02-28 09:23:32 20

转载 java并发类型容器ConcurrentHashMap解析

在 JDK1.7 的时候,ConcurrentHashMap 对整个桶数组进行了分割分段(Segment,分段锁),每一把锁只锁容器其中一部分数据(下面有示意图),多线程访问容器里不同数据段的数据,就不会存在锁竞争,提高并发访问率。老数组里的数据移动到新的数组时,位置要么不变,要么变为 index+ oldSize,参数里的 node 会在扩容之后使用链表。即为当前 key 定位出的 Node,如果为空表示当前位置可以写入数据,利用 CAS 尝试写入,失败则自旋保证成功。如果是链表,遍历查找之。

2024-02-28 00:13:26 16

原创 where和have的区别

where过滤行,having过滤分组HAVING和WHERE的差别这里有另一种理解方法,**WHERE在数据分组前进行过滤,HAVING在数据分组后进行过滤。**这是一个重要的区别,WHERE排除的行不包括在分组中。这可能会改变计算值,从而影响HAVING子句中基于这些值过滤掉的分组。

2024-02-27 21:51:01 94

转载 mysql的order by排序内部原理

这个执行流程的示意图如下,我把它称为 rowid 排序。

2024-02-27 10:15:10 20

转载 AQS 解析与原理分析

同步器的设计是基于模板方法模式的。使用者继承AbstractQueuedSynchronizer 并重写指定的方法。将 AQS 组合在自定义同步组件的实现中,并调用其模板方法,而这些模板方法会调用使用者重写的方法。//独占方式。尝试获取资源,成功则返回true,失败则返回false。//独占方式。尝试释放资源,成功则返回true,失败则返回false。//共享方式。尝试获取资源。负数表示失败;0表示成功,但没有剩余可用资源;正数表示成功,且有剩余资源。//共享方式。

2024-02-27 00:27:55 15

转载 java中的锁

synchronized 同步语句块的实现使用的是 monitorenter 和 monitorexit 指令,其中 monitorenter 指令指向同步代码块的开始位置,monitorexit 指令则指明同步代码块的结束位置。synchronized 修饰的方法并没有 monitorenter 指令和 monitorexit 指令,取得代之的确实是 ACC_SYNCHRONIZED 标识,该标识指明了该方法是一个同步方法。不过两者的本质都是对对象监视器 monitor 的获取。

2024-02-26 23:40:45 12

转载 ThreadLocal 详解

ThreadLocal类主要解决的就是让每个线程绑定自己的值,可以将ThreadLocal类形象的比喻成存放数据的盒子,盒子中可以存储每个线程的私有数据。如果你创建了一个ThreadLocal变量,,这也是ThreadLocal变量名的由来。他们可以使用 get() 和 set() 方法来获取默认值或将其值更改为当前线程所存的副本的值,从而避免了线程安全问题。

2024-02-25 16:40:00 22

转载 java线程相关内容大总结

JDK 1.2 之前,Java 线程是实现的,这是一种用户级线程(用户线程),也就是说由于绿色线程和原生线程比起来在使用时有一些限制(比如绿色线程不能直接使用操作系统提供的功能如异步 I/O、只能在一个内核线程上运行无法利用多核),在,Java 线程改为基于原生线程(Native Threads)实现,也就是说。

2024-02-25 16:03:59 12

转载 java集合详解-关于map系列

通过 key 的 hashcode 经过扰动函数处理过后得到 hash 值,然后通过 (n - 1) & hash 判断当前元素存放的位置(这里的 n 指的是数组的长度,所谓扰动函数指的就是 HashMap 的 hash 方法。JDK1.8 之后在解决哈希冲突时有了较大的变化,当链表长度大于阈值(默认为 8)(将链表转换成红黑树前会判断,如果当前数组的长度小于 64,那么会选择先进行数组扩容,而不是转换为红黑树)时,将链表转化为红黑树,以减少搜索时间。如果不指定会有默认值.解决元素冲突:拉链法。

2024-02-24 15:11:53 12

原创 java集合解析-Collection 类型

Java 集合, 也叫作容器,主要是由两大接口派生而来:一个是,主要用于存放单一元素;另一个是,主要用于存放键值对。对于Collection 接口,下面又有三个主要的子接口:List、Set 和 Queue。没有stack接口,因为stack被jdk1.6引入的Deque取代。

2024-02-22 23:41:53 959

转载 Java 代理模式详解

定义发送短信的接口实现发送短信的接口在 Java 动态代理机制中 InvocationHandler 接口和 Proxy 类是核心。Proxy 类中使用频率最高的方法是:newProxyInstance() ,这个方法主要用来生成一个代理对象。loader :类加载器,用于加载代理对象。interfaces : 被代理类实现的一些接口;h : 实现了 InvocationHandler 接口的对象;要实现动态代理的话,还必须需要实现InvocationHandler 来自定义处理逻辑。

2024-02-22 09:55:28 44

转载 java反射机制解析

缺点:让我们在运行时有了分析操作类的能力,这同样也增加了安全问题。比如可以无视泛型参数的安全检查(泛型参数的安全检查发生在编译时)。另外,反射的性能也要稍差点,不过,对于框架来说实际是影响不大的。Class 类对象将一个类的方法、变量等信息告诉运行的程序。但是我们一般是不知道具体类的,基本都是通过遍历包下面的类来获取 Class 对象,通过此方式获取 Class 对象不会进行初始化。通过类加载器获取 Class 对象不会进行初始化,意味着不进行包括初始化等一系列步骤,静态代码块和静态对象不会得到执行。

2024-02-21 23:40:02 11

原创 String 必知必会底层逻辑

String 类中使用 final 关键字修饰字符数组来保存字符串。

2024-02-21 09:08:35 240

原创 k8s的部署管理以及prometheus相关监控

接下来熟练操作k8s,我们采用搭建minikube来学习k8s。然后在altermanager里面配置相应的路由树。使用client-go通过代码创建资源。这一部分直接查看官方文档使用说明。通过kubectl创建资源。

2023-12-01 10:32:28 1133

原创 MySQL 是怎么加行级锁的(流程图分析)

非唯一索引情况唯一索引情况。

2023-11-28 09:57:06 631

转载 笔记 Lab9: File System | 文件系统

Large files (moderate)Modify bmap() so that it implements a doubly-indirect block, inaddition to direct blocks and a singly-indirect block. You’ll have tohave only 11 direct blocks, rather than 12, to make room for your newdoubly-indirect block; you’r

2023-11-23 22:22:08 636

原创 Lec15 Crash recovery

xv6文件系统实现分为七层,如图所示。

2023-11-21 16:35:29 142

原创 Lec14 File systems 笔记

文件系统中核心的数据结构就是和。

2023-11-18 21:43:23 300

转载 Lab8: Locks | 锁优化实现

kalloc()有一个空闲列表,由单个锁保护,这个在并发量较高时会产生争用的情况。kalloc 原本的实现中,使用 freelist 链表,将空闲物理页本身直接用作链表项(这样可以不使用额外空间)连接成一个链表,在分配的时候,将物理页从链表中移除,回收时将物理页放回链表中。这里解决性能热点的思路是「将共享资源变为不共享资源」。但是上述代码有可能会产生死锁的情况,cpu_a 持有自己的锁尝试偷 cpu_b,cpu_b持有自己的锁尝试偷 cpu_a,解决方案。

2023-11-12 16:19:20 159

原创 Lec13 Sleep & Wake up

进程切换的流程阻止其他CPU核的调度器线程在当前进程完成切换前,发现进程是RUNNABLE的状态并尝试运行它在进程切换的最开始,进程先获取自己的锁,并且直到调用switch函数时也不释放锁。而另一个线程,也就是调度器线程会在进程的线程完全停止使用自己的栈之后,再释放进程的锁。释放锁之后,就可以由其他的CPU核再来运行进程的线程,因为这些线程现在已经不在运行了。

2023-11-08 21:21:51 133

转载 Lab7: Multithreading

这里的线程相比现代操作系统中的线程而言,更接近一些语言中的“协程”(coroutine)。原因是这里的“线程”是完全用户态实现的,多个线程也只能运行在一个 CPU 上,并且没有时钟中断来强制执行调度,需要线程函数本身在合适的时候主动 yield 释放 CPU。添加的部分为设置上下文中 ra 指向的地址为线程函数的地址,这样在第一次调度到该线程,执行到 thread_switch 中的 ret 之后就可以跳转到线程函数从而开始执行了。设置 sp 使得线程拥有自己独有的栈,也就是独立的执行流。

2023-11-06 16:50:13 117

空空如也

空空如也

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

TA关注的人

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