自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Java core——java四种引用详解

虚引用:它是最弱的一种引用关系,一个对象是否有虚引用的存在,完全不会对其生存时间构成影响,也无法通过虚引用来取得一个对象实例。软引用可用来实现内存敏感的高速缓存(如果内存够,软引用没有被回收,则可以直接使用,如果内存不够,软引用已经被回收,则重新读取数据(如从数据库中))。软引用到底有什么用呢?比较适合用作缓存,当内存足够,可以正常的拿到缓存,当内存不够,就会先干掉缓存,不至于马上抛出。换句话说,设置虚引用的唯一目的,就是在这个对象呗收集器回收的时候收到一个系统通知或者后序添加进一步的处理。

2022-08-23 17:03:53 327

原创 深入理解操作系统——同步互斥详解

临界区指的就是那些共享资源,在程序中表现为进程中访问临界资源的一段需要互斥执行的代码,意思是同一时刻只能有一个进程进入临界区执行。在临界区执行前有进入区,对来访的进程进行筛选,检查其是否可以进入临界区,获得进入临界区资格的进程执行完临界区代码之后有退出区,在这此进程要让其他等待的进程知道临界区已经空了,它们可以再次进入进入区去获得执行临界区代码的机会。基于软件的同步解决办法线程可以通过共享一些共有变量和标志变量来同步它们的行为,一线程进入临界区之前同时判断此线程的共享变量值,判断通过后才会进入。...

2022-07-31 16:49:00 584

原创 深入理解操作系统——cpu处理机调度详解

无论当前执行的进程执行时间长度大于时间片长度或短于时间片长度,等到时间片时间结束时候,就会切换到下一进程执行,未执行完的进程继续等待排队。另外当计算机中有多个处理机的时候,每个处理机的调度算法可不相同,但要注意共享资源的访问要进行同步,进程分在哪个处理机上执行有静态和动态两种分配方式。处理机资源的使用模式是在时间片机制下,当当前时间片运行结束后,或者cpu在时间片未执行完之前被抢占时,这时候cpu得去决定去就绪队列里挑选下一个要执行的进程。将就绪队列划分为多个独立的子队列,分别有各自的调度算法。...

2022-07-31 16:45:45 498

原创 深入理解操作系统——进程控制详解

进程创建在unix系统中的系统调用指令是fork()和exec(),fork()进行把一个进程复制成两个进程,复制父进程所有的变量和内存以及所有cpu寄存器,子进程的pid=0,exec()用新程序来重写当前进程。执行Fork()创建新进程复制父进程的所有信息,但是有些内存信息并不需要,反而增加了开销,所以有了一个轻量级的vfork()系统调用,此创建进程时,不再创建一个同样的内存映射。上下文指的是一些进程生命周期的信息,如寄存器状态,cpu状态,内存地址空间等,这些信息存在。...

2022-07-31 16:43:13 147

原创 深入理解操作系统——页面置换算法详解

页面置换算法是应用到发生缺页异常时操作系统该以什么样的机制去交换内存与外存的页面。其算法的设计目标是减少页面的调入调出次数。还有一类是全局页面置换算法,全局指的是置换页面的选择范围是所有可换出的物理页面,实现算法有工作集算法和缺页率算法。这一类共有三种算法最优算法、先进先出算法、最近最久未使用算法、时钟算法、最不常用算法。仅限于当前进程(意味着在置换的过程中每个进程分配的页面总数不会变化)一类是局部页面置换算法,局部就是置换页面的选择范围。...

2022-07-31 16:40:34 614

原创 深入理解操作系统——虚拟存储详解

因为程序的大小在不断的变大,内存的增长速度远远跟不上程序增大的速度,所以内存需要外存的配合来完成对程序的运行存储。虚拟存储是非连续内存分配的延续,后者是在内存里的存储空间让它不连续,前者是在后者的基础上将一部分内容放在外存中的做法,可以让应用程序有更大的空间可以使用。虚拟存储就是只把部分程序放入内存中,从而运行比物理内存大的程序,它的前提思想是局部性原理。交换技术覆盖是一个程序的内存空间不够,交换是一个程序够用,但由于多道程序的运行,使得另一个程序占用了内存空间,使得之前的空间不够。...

2022-07-31 16:38:47 1389

原创 深入理解操作系统——非连续内存分配方式详解

上面存储管理里说的动态分配策略都是存储在连续的物理内存中,这有几个缺点分配给程序的物理内存必须连续,存在内存碎片,内存利用率低等缺点,所以为了提高内存利用率和管理的灵活性,就需要提出非连续内存分配的办法,最终能给达到使得一个程序可以使用非连续的物理地址空间,共享代码和数据,支持动态加载和动态链接。一个进程有不同的块组成,如代码段,堆栈段等,这些在进程的逻辑地址空间上是连续存储的,使用段式和页式存储管理的方式实现其在物理地址空间上的非连续存储。在逻辑地址空间中,将空间分为大小相同的页面,简称为“页”。...

2022-07-31 16:36:32 289

原创 深入理解操作系统——存储管理详解

操作系统需要对这么多的存储设备进行管理,计算机运行的每个进程在内存中都有独立的内存空间,它们也只能访问自己的内存空间,其物理地址是不一样的,并且每个进程的逻辑结构不是必须连在一起的,是分段的,分成了数据,代码,堆栈等,还有一种管理方式就是将内存分页,把内存分为最基本的单位,然后选取一个合适的大小作为一页。每一个进程运行时,都会给其分配一块不小于指定大小的连续的物理内存区域,给一个进程分配内存采用的是动态分配分配策略,是指其指定大小是可变的分区,且分区的地址是连续的。...

2022-07-31 16:32:58 378

原创 Java core——深入理解接口和抽象类

那么在设计的时候,可以将飞机设计为一个类Airplane,将鸟设计为一个类Bird,但是不能将飞行这个特性也设计为类,因此它只是一个行为特性,并不是对一类事物的抽象描述。如果一个类继承了某个抽象类,则子类必定是抽象类的种类,而接口实现则是有没有、具备不具备的关系,比如鸟是否能飞(或者是否具备飞行这个特点),能飞行则可以实现这个接口,不能飞行就不实现这个接口。类可以不实现抽象类和接口声明的所有方法,当然,在这种情况下,类也必须得声明成是抽象的。抽象类是对一种事物的抽象,即对类抽象,而接口是对行为的抽象。...

2022-07-30 12:53:37 188

原创 Concurrent Program——Executor框架梳理

然后将任务提交给Executor框架下的另一个部分即实现管理一个线程池和执行任务的类,Executor接口以及ExecutorServerice接口,接口只是定义了一些方法,具体的实现由下面的实现类去实现,实现一个什么样的线程池,以及送进来的任务放到什么样的工作队列中,任务怎么执行。线程池的好处有集中管理线程,重用线程,不浪费资源,提高响应速度等好处(避免了线程的创建过程)。我们的程序写出想要执行的任务,任务的类实现Runnable或者Callable接口。它实现了把任务和任务的执行解耦。...

2022-07-30 12:15:44 131

原创 务实java虚拟机——常量池详解

常量池,用于存放编译期生成的各种字面常量(编译期间就能确定的数据,存储的是实际的数据大小)和符号引用(类或接口的全限定名,字段的名称和描述符,方法的名称和描述符)class文件常量池是Java文件经过编译后生成的class文件中的一部分,它主要包含以下图片中的内容分为字面量和符号引用。规范并不要求常量只能在运行时才产生,也就是说运行时常量池的内容并不全部来自。在jvm中,常量池分为class文件常量池,运行时常量池,字符串常量池。文件常量池和运行时常量池中,都没有直接存储字面量对应的实际对象。...

2022-07-30 10:41:14 494 1

原创 Java core——注解详解

我个人使用的理解,annotation是一种在类、类型、属性、参数、局部变量、方法、构造方法、包、annotation本身等上面的一个附属品(ElementType这个枚举中有阐述),他依赖于这些元素而存在,他本身并没有任何作用,annotation的作用是根据其附属在这些对象上,引入注解(java.lang.annotation包)用一个词就可以描述注解,那就是元数据,即一种描述数据的数据。注解就是描述数据的数据,它可以对一个类,或者一个字段,方法等进行描述。在类加载的时候丢弃。元注解(描述注解的注解).

2022-07-30 10:26:59 211

原创 Java core——深入理解java传递方式

在判断实参内容有没有被修改的时候,要看传递的是什么,如果只是一个地址,那么要看这个地址会不会被换掉,而不是看地址指向对象的变化。一份(字面量值的拷贝/地址值的拷贝)传递到函数中,这样在函数中对参数进行修改,不会影响到实际参数。当一个对象作为参数传递给一个方法,此方法可以改变这个对象的属性,到底是值传递还是引用传递?引用类型变量保存的是实际对象的地址,称这种变量为引用。如果参数是引用类型,传递的是该参量所引用的对象在堆中地址值的拷贝。如果参数是基本类型,传递的是基本类型的字面量值的拷贝。...

2022-07-28 14:16:24 152

原创 深入理解spring——spring bean详解

注释之间的区别纯粹是信息性的。它们允许你根据通用职责轻松。查找带注释的类的过程称为组件扫描。或其派生类进行注释的类,并将它们用作。类标记为特定应用程序层的成员,框架在运行时管理的对象。你可以使用这些注释将。框架应该将哪些类用作。框架会将它们全部视为。......

2022-07-28 14:12:10 216

原创 深入理解spring——AOP详解

而这种动态代理实际上是JDK的一个特性(Proxy模式,在Proxy的调用过程中,如果客户调用Proxy的request方法,先调用Proxy的前处理方法,再调用目标对象的request方法,再调用Proxy的后处理方法(通过反射、拦截器链等实现))在AopProxy代理的接口方法被调用执行时(调用原对象的方法即调用代理对象的方法),首先会触发对这些方法调用进行拦截,这些拦截对目标调用的功能增强提供了工作空间,拦截过程在JDK的proxy代理对象中是通过invoke方法来完成的。连接点和切点什么区别呢?..

2022-07-28 14:08:09 198

原创 深入理解spring——代理模式详解

代理分为静态代理和动态代理,静态代理是在编译时就将接口、实现类、代理类一股脑儿全部手动完成,但如果我们需要很多的代理,每一个都这么手动的去创建实属浪费时间,而且会有大量的重复代码,此时我们就可以采用动态代理,动态代理可以在程序运行期间根据需要动态的创建代理类及其实例,来完成具体的功能。2、java不支持多继承,如果一个类实现了一组接口,对其进行代理时,不同接口的不同方法都会得到增强。为了简化对象创建过程,Proxy类中的newInstance方法封装了2~4,只需两步即可完成代理对象的创建。...

2022-07-28 14:04:56 528

原创 深入理解Spring——ioc容器详解

BeanDefinitionRegistry接口是将各个BeanDefinition接口的实例统一放到一起,定义抽象了Bean的注册逻辑,将各个Bean联系起来,完成Bean的注册与加载。它大多数使用xml文件注册并管理各个对象之间的相互依赖关系,并不影响应用的设计和开发流程。BeanFactory要干的事就是业务对象的new和对象之间依赖关系的绑定,对于使用者来说,我们只需要按照规则将依赖关系写在配置文件中,当我们需要使用某一个对象时,只需要调用BeanFactory提供的接口去获得对象以及其他的操作。.

2022-07-28 13:59:16 445

原创 深入理解spring——IOC详解

不使用ioc思想的对象,需要自己在程序内部显式的使用new关键字去主动的得到所需要的对象,而使用了ioc思想后,我们可以通过有参数的构造方法或者setter方法只需要传入我们需要的对象名称,区别在与构造方法在当前对象构造好之后所有依赖的对象就已经就绪,setter的方式需要我们构造好当前对象之后再调用setter方法去传入我们所需要的对象名称。配置文件方式(xml)等以更清晰的展示给程序员的方式底层都是通过编码的方式来实现,只不过这部分代码不需要程序员再去写。...

2022-07-28 13:52:39 139

原创 深入理解Redis系列——发布与订阅详解

如果在调用B接口的发生异常,此时可能就导致下单支付接口返回失败,但是此时A接口其实已经调用成功,这就代表它内部已经处理下单支付成功的结果。如果就两个业务需要获取下单支付的结果,那也还好,程序改造也快。这样就会导致A,B,C三个下游接口,A获取成功获取支付结果,但是B,C没有拿到,导致三者系统数据不一致的情况。第一,下单支付业务与其他业务重度耦合,每当有个新业务需要支付结果,就需要改动下单支付的业务。后面如果又有新的业务,比如说积分服务,他需要获取下单支付的结果,然后增加用户的积分。...

2022-07-28 10:10:59 173

原创 深入理解Redis系列——集群详解

与此相反,ASK错误只是两个节点在迁移槽的过程中使用的一种临时措施在客户端收到关于槽i的ASK错误之后,客户端只会在接下来的一次命令请求中将关于槽i的命令请求发送至ASK错误所指示的节点,但这种转向不会对客户端今后发送关于槽i的命令请求产生任何影响,客户端仍然会将关于槽i的命令请求发送至目前负责处理槽i的节点,除非ASK错误再次出现。Redis3.0加入了Redis的集群模式,实现了数据的分布式存储,对数据进行分片,将不同的数据存储在不同的master节点上面,从而解决了海量数据的存储问题。...

2022-07-28 10:09:16 463 1

原创 深入理解Redis系列——Sentinel详解

比如当主服务器下线了,sentinel就会从主服务器的那些从服务器中选一个出来当作新的主服务器,然后发出命令让其他从服务器去复制这个新的主服务器,当原来的主服务器再次上线后,然后作为新主服务器的从服务器。哨兵模式,是由一个或者多个哨兵实例组成的哨兵系统,这个系统可以监视多个主服务器和从服务器,并在被监视的主服务器进入下线状态时,自动将某个从服务器升级为新的主服务器,然后由新的主服务器替代原来下线的主服务器继续工作。Sentinel启动后,会先根据配置文件去初始化监视的服务器结构,即masters字典。...

2022-07-28 10:08:30 685

原创 深入理解Redis系列——主从复制详解

是一个固定大小的先进先出的缓存队列,主服务器会把命令传播过程中的命令除了发给从服务器之外,也会写进这个队列,然后假如遇到了断线重连,就去复制积压缓冲区中查看这部分相差的数据是否还在其中,如果在,就执行部分重同步操作,如果不在,就执行完全重同步操作。同步是从服务器向主服务器发送sync命令,主服务器开始执行bgsave保存rdb文件,另外在保存期间新执行的写命令写在缓冲区中,然后将rdb文件和缓冲区的命令一同发给从服务器,让从服务器去执行。相差的数据保存在哪呢,其实主服务器维护着一个。...

2022-07-28 10:06:16 97

原创 深入理解Redis系列——持久化机制详解

AOF重写是在后台进行的,因为不想阻塞父服务器继续处理请求,所以创建了一个子进程去执行重写,子进程中有父进程数据库状态的拷贝,但子进程在重写过程中,可以父进程又有新的写命令使得数据库状态发生了改变,可能造成数据库状态和AOF文件的不一致问题,所以Redis服务器设置了一个AOF重写缓冲区,存放这一期间的写命令。有两个命令用于生成RDB文件,SAVE和BGSAVE,两者的不同点在于SAVE是将redis进程阻塞后进行保存,BGSAVE是创建出一个子进程完成RDB文件的保存,父进程可以继续处理请求命令。...

2022-07-27 18:06:36 163

原创 深入理解Redis系列——过期策略详解

Redis服务器保存着一个redisDb数组,数组的大小是数据库的数量,数组的大小默认为16,redis客户端可通过select命令选择对哪个数据库进行操作,具体实现是在服务器内部有一个redisClient结构中存储着redisDb的指针指向数组中一个具体的数据库,通过修改这个指针可以实现切换数据库。但它的缺点是如果当过期键比较多的时候,占用过多的cpu时间,而如果再这时候内存不是很紧张的时候,且大量的请求命令过来,让cpu去删除那些键无疑是不合适的。因为保存的时候会对所有的键进行检查。...

2022-07-27 18:05:19 538

原创 深入理解Redis系列——对象系统详解

Redis并没有直接使用底层数据结构来实现键值对数据库,而是基于这些数据结构创建了一个对象系统,这个系统包含字符串对象、列表对象、哈希对象、集合对象和有序集合对象这五种类型的对象,每种对象都用到了至少一种我们前面所介绍的数据结构。通过这五种不同类型的对象,Redis可以在执行命令之前,根据对象的类型来判断一个对象是否可以执行给定的命令。使用对象的另一个好处是,我们可以针对不同的使用场景,为对象设置多种不同的数据结构实现,从而优化对象在不同场景下的使用效率。...

2022-07-27 18:03:04 156

原创 深入理解Redis系列——底层数据结构类型详解

现在我们建了很多级索引,最高级的索引,就两个元素0、5000,次高级索引四个元素0、2500、5000、7500,依次类推,当我们查找7890这个元素时,查找路径为0、5000、7500...7890,通过最高级索引直接跳过了5000个元素,次高层索引直接跳过了2500个元素,从而使得链表能够实现二分查找。zskipList中有指向表头和表尾的指针,一个level字段,记录了层数最多的节点的层数大小,相当于上面的例子中的索引级数,索引的高度,一个length字段,记录链表节点个数。...

2022-07-27 18:00:14 230

原创 务实java虚拟机——双亲委派模型详解

这中层次关系称为双亲委派模型,双亲委派加载机制是当一个类加载器加载一个类时,首先将加载这个类的任务交给其父类类加载器,然后一直向上直到启动类加载器,如果父类类加载器不能加载才交给子类加载器去加载,这样保证了基础类性在不同的环境中是同一个类。Java保持着三层类加载器,双亲委派的类加载架构,类加载器层次结构从上到下是启动类加载器、平台类加载器、应用程序类加载器、自定义加载器。2、通过委派的方式,可以避免类的重复加载,当父加载器已经加载过某一个类时,子加载器就不会再重新加载这个类。如何主动破坏双亲委派机制?..

2022-07-27 15:37:17 235

原创 务实java虚拟机——类加载过程详解

符号引用就是一组符号来描述所引用的目标。解析阶段的目的,是将常量池内的符号引用转换为直接引用的过程(将常量池内的符号引用解析成为实际引用)。如果符号引用指向一个未被加载的类,或者未被加载类的字段或方法,那么解析将触发这个类的加载(但未必触发这个类的链接以及初始化。验证确保class文件中的字节流包含的信息,符合当前虚拟机的要求,保证这个被加载的class类的正确性,不会危害到虚拟机的安全。类加载的时机触发一个类进行加载分为主动加载和被动加载,主动加载比如有new关键字、使用静态字段、调用静态方法等。...

2022-07-27 15:33:33 176

原创 务实java虚拟机——内存分配原则详解

新生代使用了复制收集算法,在一次MinorGC后,如果有大量对象存活,需要把Survivor无法容纳的对象直接送入老年代,但它的前提是保证老年代有那么大的空间。老年代的空间大小就承担的担保的职责。虚拟机并不是永远要求对象的年龄必须达到-XXMaxTenuringThreshold才能晋升老年代,如果在Survivor空间中相同年龄所有对象大小的总和大于Survivor空间的一半,年龄大于或等于该年龄的对象就可以直接进入老年代,无须等到-XXMaxTenuringThreshold中要求的年龄。...

2022-07-27 15:27:49 385

原创 务实java虚拟机——常用的垃圾回收器详解

parallelScavenge收集器也是新生代收集器,其注重的是吞吐量这个指标,吞吐量是运行用户代码时间占用的比值大小,这个值不是越大越好,因为如果垃圾收集时间较少,虽然提高的吞吐量,但时间少了,收集的垃圾就越少,每一次收集过后会造成垃圾的积累,对内存大小造成压力。3)重新标记(为了修正并发标记期间因用户程序继续运作而导致标记变动的那一部分对象的标记记录;serial是用在新生代的垃圾收集器,是一个单线程收集器,单线程的意思是,在垃圾收集的时候只有垃圾收集线程在运行,用户线程全部被停止。...

2022-07-27 15:27:09 173

原创 务实java虚拟机系列——垃圾收集详解

进而在回收频率上,对新生代经常回收,老年代则间隔长些。但划分区域并不是如此简单,会有跨代引用的问题,如果在对新生代进行回收时,某个对象是被老年代中的对象引用,碍于这种情况,每次都要对老年代中的对象进行遍历。但是经过验证,有了另一条经验存在互相引用关系的两个对象,是应该倾向于同时生存或者同时消亡的,并且在对新生代的回收时,那些存在跨代引用的对象也应该升级到老年代中。首先标记出所有需要回收的对象,在标记完成后,统一回收掉所有被标记的对象,也可以反过来,标记存活的对象,统一回收所有未被标记的对象。...

2022-07-27 15:20:41 107

原创 务实java虚拟机——运行时数据区详解

在编译代码的时候,栈帧中需要多大的局部变量表,多深的操作数栈都已经完全确定了,并且写入到了方法表的Code属性中,因此一个栈帧需要分配多少内存,不会受到程序运行期变量数据的影响,而仅仅取决于具体虚拟机的实现。Java虚拟机规范规定,Java堆可以出于物理上不连续的内存空间中,只要逻辑上连续即可,如同磁盘空间一样,既可以实现成固定大小,也可以是扩展的,当前主流虚拟机都是按照扩展来实现的(通过-Xmx和-Xms控制)。此处的调用方的形参x被放入操作数栈,同时,被调用方的局部变量表也共享了此处区域。...

2022-07-27 15:15:03 176

原创 深入理解Mysql系列——数据库调优详解

有时候需要索引很长的字符列,这会让索引变得大且慢。一个方式是使用哈希索引,另一个是使用前缀索引,即索引开始的部分字符串,这样可以节约索引空间,提高效率。1、查询不需要的记录使用select语句查询大量结果,然后再获取前N行(如新闻网站,取100条记录,只显示前面的10条),这时可以使用limit(limit1,10;6、切分查询,将大查询切分成小查询,每个查询功能一样,只完成一小部分,如果用一个大的语句一次性完成的话,则可能需要一次锁住很多数据、耗尽系统资源、阻塞很多小的但重要的查询。...

2022-07-26 19:31:26 108

原创 深入理解Mysql系列——事务详解

执行rollback的关键在于释放申请的锁和回归及时写入状态,而并不是放弃未写入的操作(你关心的点在未写入的操作,然而执行与不执行rollback都没有操作写进去,所有你感觉执行或不执行都没什么区别)。当只执行第一条SQL时,A通知B查看账户,B发现确实钱已到账(此时即发生了脏读),而之后无论第二条SQL是否执行,只要该事务不提交,则所有操作都将回滚,那么当B以后再次查看账户时就会发现钱其实并没有转。3、隔离性(Isolation)事务的执行不受其他事务的干扰,事务执行的。...

2022-07-26 19:29:48 93

原创 深入理解Mysql系列——索引详解

而InnoDB使用了聚簇索引,可以说聚簇索引就是表,因为他的叶子节点上存放了数据行的所有数据,另外,InnoDB的二级索引和聚簇索引也有很大不同,二级索引中的叶子节点存放了主键值,这样当出现行移动时减少了二级索引的维护工作。而除了聚簇索引以外的所有索引都称为二级索引,二级索引的叶子节点内容是主键的值。主键索引存储的是主键id和全部数据,二级索引储存的是索引值和主键值,当我们查询的字段不在索引储存的数据中,就会进行回表,即通过普通索引找到主键值,再通过主键值查询主键索引找到要查的数据,这就是回表操作。...

2022-07-26 19:17:34 554

原创 深入理解Mysql系列——存储引擎详解

innodb寻址要映射到块,再到行,MYISAM记录的直接是文件的OFFSET,定位比INNODB要快,innodb因为是聚簇索引,它把一块数据读入内存后建立索引然后定位,而MYISAM是通过数据的物理位置引用被索引的行,MYISAM是根据索引之间去物理地址中查找行。MyISAM只要发给他们对应那表的frm.MYD,MYI的文件,让他们自己在对应版本的数据库启动就行,而Innodb就需要导出xxx.sql了,因为光给别人文件,受字典数据文件的影响,对方是无法使用的。(2)插入不频繁,查询非常频繁;...

2022-07-26 18:45:49 262

原创 深入理解Mysql系列——行存储和列存储详解

假设我们换个场景思考,我们是做电商的,每年产生1000亿条订单,每条订单有50种属性(50个字段),我们的分析师需要分析商品的平均价格,这个时候如果用mysql,就需要把1000亿条全部50个字段数据都从磁盘读取,但是只取了其中price字段使用,因为多读取了49个字段的无用数据,磁盘和内存都会成为性能瓶颈,这个操作非常低效非常慢。因为有页表,所以读取内存的值往往是2k,4k这样的值,导致磁盘一块读入内存中也是2k,4k,所以一个块的大小往往和2k,4k这样的数字有关系。这是行存储的基本逻辑。...

2022-07-26 18:35:38 2939

原创 Concurrent Program——深入理解ConcurrentHashMap

和Hashtable都是支持并发的,这样会有一个问题,当你通过get(k)获取对应的value时,如果获取到的是null时,你无法判断,它是put(k,v)的时候value为null,还是这个key从来没有做过映射。第一个结点(即table表中的结点,哈希值相同的链表的第一个节点)进行加锁(锁是该结点,如果此时还有其他线程想来put,会阻塞)(如果不加锁,可能在遍历链表的过程中,又有其他线程放进来一个相同的元素,但此时我已经遍历过,发现没有相同的,这样就会产生两个相同的)设置完毕后代表桶迁移工作已经完成,.

2022-07-22 01:34:22 149

原创 Concurrent Program——深入理解Volatile

在cpu中,例如一条指令的执行分为取指令,指令译码,执行指令,内存访问,数据写回这五个步骤。如果每一条指令都按这样的顺序串行执行,会耗费大量的时间,所以,后来cpu就设计为可以在同一时刻执行这五个阶段,即同一时刻可以执行多级指令,称为多级指令流水线。在某个时刻使用不同线程观察内存的数据,可能看到不一样的结果,因为写是需要耗时的,写和读之间,有的线程看到写发生了,有的看到没发生。当某一线程对一个变量进行了修改,它还没来得及将值更新回主存的时候,另一个核心中的线程对它进行了读取,就有可能读取的还是旧的值。...

2022-07-22 01:29:17 129

原创 Concurrent Program——深入理解AQS

AQS全称AbstractQueueSynchronizer,是区别于Synchronized,是java提供的另一个实现同步的体系。从下图中可以看出,常用的控制并发的工具都是基于AQS实现,比如ReentratLock,读写锁等。为什么要设计一套AQS框架?当程序发生并发的时候,有临界区需要保护,保护临界区最常用的就是锁(互斥量Mutex)锁的一种实现有Synchronized,另一种保护临界区就是信号量控制临界区的并发量,并发量=1的时候就是互斥量。,此类支持默认的。...

2022-07-22 01:10:17 216

空空如也

空空如也

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

TA关注的人

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