自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 【Java并发编程系列】- wait & notify,park & unpark,ReentrantLock

而ReentrantLock支持多间休息室,有专门等烟的休息室、专门等早餐的休息室,唤醒时也是按休息室来唤醒。ReentrantLock 的条件变量比 synchronized 强大之处在于,它是支持。synchronized是那些不满足条件的线程都在一间休息室等消息。有了多个等待区,就可以避免虚假唤醒,从而简化while-wait。每个线程都有一个自己的park对象 ,该对象由。无论是先使用还是后使用,都能恢复被暂停的线程。公平锁:在线程获取锁失败,进入阻塞队列时,被打断了就不用阻塞了,直接停止运行。

2025-03-03 01:20:24 679

原创 【Java并发编程系列】- 锁膨胀机制

当 Thread-0 退出 synchronized 同步块时,使用 cas 将原本Mark Word 的值恢复给对象头,因对象的对象头指向 Monitor,cas失败 ,会进入重量级锁的解锁过程,找到 Monitor 对象,将 Owner 设置为 null ,唤醒 EntryList 中的 Thread-1 线程。一个对象如果有多个线程要对它加锁使用,但加锁使用的时间的错开的,则可采用轻量级锁来优化。对于不同的锁状态,后两个位是不同的,系统会根据后两个位来判断当前对象的锁状态。

2025-03-03 01:08:36 655

原创 【Java并发编程系列】- 线程共享的安全性问题

共享指共享内存区域(堆,方法区),只有栈、本地方法栈、PC是线程私有的。多线程带来问题的原因是对共享变量的读写操作,不具原子性,并行情况下多个线程读写混乱;以及并发情况下线程上下文切换导致成员变量被修改以及没来及写回就被其他线程读,如两线程都对非局部变量count,count++,count--

2025-03-03 00:50:57 863

原创 【Java并发编程系列】- Java并发编程基础

默认情况下Java进程需要等其中所有线程全结束才会结束,但若设置某线程为守护线程,则在其他线程全结束的情况下,即使守护线程还没执行完,Java进程也会停止,守护线程自动被结束。多线程时,每个线程都会维护自己的栈和栈帧,每个线程只能有一个活动栈帧,对应当前正在执行的方法,方法执行完会返回到栈帧中方法出口地址的位置,然后从栈中pop出栈。直接使用 run 的方式,在mian中直接调用t1线程的run方法,则会是main方法调用执行run方法中的内容,t1会一直处于在新建状态。

2025-03-03 00:36:23 583

原创 【Spring系列】- 深入理解Spring AOP

对于系统中普通的业务关注点,OOP可以很好地对其进行分解并使之模块化,但却无法更好地避免类似于系统需求的实现在系统中各处散落的问题。AOP全称为Aspect-OrientedProgramming,面向切面编程。使用AOP,我们可以对类似于Logging和Security等系统需求进行模块化的组织

2025-03-01 13:06:38 755

原创 【Spring系列】- ApplicationContext

ApplicationContext构建于BeanFactory之上,除了拥有BeanFactory支持的所有功能之外,还进一步扩展了基本容器的功能,包括BeanFactoryPostProcessor、BeanPostProcessor以及其他特殊类型bean的自动识别、容器启动后bean实例的自动初始化、国际化的信息支持、容器内事件发布等

2025-02-28 14:00:51 917

原创 【Spring系列】- IoC容器的两阶段

BeanPostProcessor是容器提供的对象实例化阶段的强有力的扩展点。BeanPostProcessor的两个方法中都传入了原来的对象实例的引用,这为扩展容器的对象实例化过程中的行为提供了极大的便利,几乎可以对传入的对象实例执行任何的操作。该接口定义很简单,其作用在于,在对象实例化过程调用过“BeanPostProcessor的前置处理”之后,会接着检测当前对象是否实现了InitializingBean接口,如果是,则会调用它的afterPropertiesSet()方法进一步调整对象实例的状态。

2025-02-28 13:45:04 936

原创 【Spring系列】- 对象生命周期管理:bean的scope

在Spring 2.0之后的版本中,容器提供了对scope的扩展点,可以根据自己的需要,来添加自定义的scope类型。默认的singleton和prototype是硬编码到代码中的,而request、session、global session和自定义scope类型,则属于可扩展的scope行列,都实现了org.springframework.beans.factory.config.Scope接口。

2025-02-28 13:35:44 619

原创 【Spring系列】- 如何表达Bean之间依赖性

如果bean定义中的autowire=byType,那么容器会根据当前bean定义类型,分析其相应的依赖对象类型,然后到容器所管理的所有bean定义中寻找与依赖对象类型相同的bean定义,然后将找到的符合条件的bean自动绑定到当前bean定义。local只能指定与当前配置的对象在同一个配置文件的对象定义的名称;按照Spring的IoC容器配置格式,要通过构造方法注入方式,为当前业务对象注入其所依赖的对象,需要使用,并通过元素来指明容器将为djNewsProvider这个注入通过所引用的Bean实例。

2025-02-28 13:26:48 577

原创 【Spring系列】- BeanFactory

每一个受管的对象,在容器中都会有一个BeanDefinition的实例(instance)与之相对应,该BeanDefinition的实例负责保存对象的所有必要信息,包括其对应的对象的class类型、是否是抽象类、构造方法参数以及其他属性等。如果bean定义中的autowire=byType,那么容器会根据当前bean定义类型,分析其相应的依赖对象类型,然后到容器所管理的所有bean定义中寻找与依赖对象类型相同的bean定义,然后将找到的符合条件的bean自动绑定到当前bean定义。

2025-02-28 13:17:23 1009

原创 【Spring系列】- 深入理解Spring IoC

IoC全称Inversion of Control控制反转,别名为Dependency Injection依赖注入。如果我们依赖于某个类或服务,最简单而有效的方式就是直接在类的构造函数中新建相应的依赖类。可是我们自己每次用到什么依赖对象都要主动地去获取,这是否真的必要?我们最终所要做的,其实就是直接调用依赖对象所提供的某项服务而已。只要用到这个依赖对象的时候,它能够准备就绪就行。如果有人能够在我们需要时将某个依赖对象送过来,为什么还要自己去折腾?

2025-02-28 12:34:08 907

原创 【网络协议系列】- HTTPS=HTTP+加密+认证+完整性保护

HTTP 协议中可能存在或等安全问题,使用 HTTPS 可以有效防止这些问题。

2025-02-28 12:09:33 729

原创 【网络协议系列】- HTTP状态码和报文首部字段

当 301、302、303 响应状态码返回时,几乎所有的浏览器都会把POST 改成 GET,并删除请求报文内的主体,之后请求会自动再次发送;调用 Cookie 时,由于可校验 Cookie 的有效期,以及发送方的域、路径、协议等信息,所以正规发布的 Cookie 内的数据不会因来自其他 Web 站点和攻击者的攻击而泄露。:该状态码表示客户端进行了范围请求,而服务器成功执行了这部分的GET请求,响应报文中包含由 Content-Range 指定范围的实体内容。客户端会要求所有的中间服务器不返回缓存的资源。

2025-02-28 12:02:05 998

原创 【网络协议系列】- HTTP基础

根据 Web 浏览器地址栏中指定的URL,Web 浏览器从 Web 服务器端获取文件资源等信息,从而显示出 Web 页面像这种通过发送请求获取服务器资源的 Web 浏览器等,都可称为客户端(client)Web 使用 HTTP(HyperText Transfer Protocol,超文本传输协议)作为规范,完成从客户端到服务器端等一系列运作流程。可以说,Web 是建立在 HTTP 协议上通信的。

2025-02-28 01:44:27 809

原创 【网络协议系列】- TCP流量控制与拥塞控制

对一些数据吞吐量要求较高的应用,总是希望每次发送尽可能多的数据到主机,对于这类应用,TCP使用滑动窗口协议,该协议允许发送方连续发送多个分组,因此可以加速数据的传输。当接收端接收到TCP报文段后,并不立即发送ACK报文,而是等上一段时间,如果这段时间里该主机有数据要发送回去,就将该数据捐带上ACK一起发送过去。为了防止产生超时重传,绝大多数情况下,等待时间为200ms,超过了200ms,如果没有数据一起发送,就直接发送ACK报文。成块数据类型,如:FTP,这类协议一般传输的数据量比较大。

2025-02-28 01:20:21 551

原创 【网络协议系列】- TCP连接建立与释放

加上IP首部的源IP地址和目的IP地址,确定唯一的一个TCP连接,通过目的端口来决定TCP将数据报交付哪个应用程序,从而实现TCP的分用功能。由于TCP是面向字节流的,传送的字节流中的每一个字节都按序编号,序号字段指本报文段所发送的数据的第一个字节的序号。对客户端来说,如果终止并立即重启一个客户程序,则新的客户程序将不再重用之前相同的本地端口,而是使用新的端口。TCP报文段首部的前20个字节是固定的,后面有4n字节的选项数据,因此TCP报文段的最小长度为20个字节。

2025-02-28 01:14:16 570

原创 【网络协议系列】- 五层模型

虽然理论上能传,但要考虑网络的最大承载能力,标准的TCP/IP分组大小为576字节,减去20字节的IP首部,20字节的TCP首部,24字节的路由协议头,还剩512字节,因此数据部分一般不超过512字节。以太网协议采用广播方式发送数据包,所有成员人手一"包",不仅效率低,而且局限在发送者所在的子网络,如果两台计算机不在同一个子网络,广播是传不过去的。收到广播的主机读取这个包的"标头",找到接收方的MAC地址,然后与自身的MAC地址相比较,如果两者相同,就接受这个包,做进一步处理,否则就丢弃这个包。

2025-02-28 01:01:43 1148

原创 【MySQL原理系列】- MySQL查询性能优化

用户自定义变量如果能够用好,在某些场景可以写出非常高效的查询语句。在查询中混合使用过程化和关系化逻辑的时候,自定义变量可能会非常有用用户自定义变量是一个用来存储内容的临时容器,在连接MySQL的整个过程中都存在,可以使用SET和SELECT语句来定义它们,然后在任何可以使用表达式的地方使用使用自定义变量的查询,无法使用查询缓存不能在使用常量或者标识符的地方使用自定义变量,例如表名、列名和LIMIT 子句中用户自定义变量的生命周期是在一个连接中有效,所以不能用它们来做连接间的通信。

2025-02-28 00:41:27 792

原创 【MySQL原理系列】- 其他索引优化策略

另一个比较好的策略是使用延迟关联,通过使用覆盖索引查询返回需要的主键,再根据这些主键关联原表获得需要的行,这可以减少MySQL扫描那些需要丢弃的行数。因为查询只能使用索引的最左前缀,直到遇到第一个范围条件列,尽可能将需要做范围查询的列放到索引的后面,以便优化器能使用尽可能多的索引列。为不同的组合列创建单独的索引,对某些具体的查询来说可能都是更优化的,但是考虑到索引的维护和额外的空间占用的代价。在传统的查询执行方式中,数据库会立即进行表的关联,然后访问所有的行数据,而延迟关联策略则会首先使用。

2025-02-28 00:26:36 610

原创 【MySQL原理系列】- 高性能的索引策略(重要)

高效地选择和使用索引有很多种方法,有些是针对特殊案例的优化,有些是针对特定行为的优化。

2025-02-28 00:11:58 640

原创 【MySQL原理系列】- MySQL的索引

如果存储引擎不支持哈希索引,则可以模拟像InnoDB一样创建哈希索引在B-Tree基础上创建一个伪哈希索引,”伪“指仍用B-Tree进行查找,但是它使用哈希值而不是键本身进行索引查找需要做的就是在查询的WHERE中手动指定使用哈希函数,并维护哈希值不要使用SHA1() 和MD5() 作为哈希函数,因为其是是强加密函数,计算出来的哈希值很长,旨在最大限度消除冲突,但这里并不需要这样高的要求要避免冲突问题,当使用哈希索引进行查询的时候,必须在WHERE 条件中带入哈希值和对应列值。

2025-02-27 23:56:42 909

原创 【MySQL原理系列】- Schema与数据类型优化

在 MySQL 中,Schema(架构)和数据库(Database)基本是同义的概念。创建一个 Schema 实际上就是创建一个数据库,所有属于该数据库的表和其他对象都归属于这个 Schema良好的逻辑设计和物理设计是高性能的基石,应该根据系统将要执行的查询语句来设计schema:比如反范式的设计可以加快某些类型的查询,但同时可能使另一些类型的查询变慢比如添加计数表和汇总表是一种很好的优化查询的方式,但这些表的维护成本可能会很高MySQL独有的特性和实现细节对性能的影响也很大。

2025-02-27 23:49:07 755

原创 【MySQL原理系列】- MySQL中的数据类型

包括TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT ,分别使用8,16,24,32,64位存储空间,值范围从−2^(N−1) 到2^(N−1) −1,N是存储空间的位数。与CHAR 和VARCHAR 类似的类型还有BINARY 和VARBINARY ,它们存储的是二进制字符串,二进制字符串存储的是字节码而不是字符,填充BINARY采用的是\0(零字节)而不是空格。二进制类型是TINYBLOB,SMALLBLOB,BLOB,MEDIUMBLOB,LONGBLOB。

2025-02-27 23:43:20 882

原创 【MySQL原理系列】- MySQL的存储引擎

在文件系统中,MySQL将每个数据库(也可以称之为schema)保存为数据目录下的一个子目录创建表时,MySQL会在数据库子目录下创建一个和表同名的.frm文件保存表的定义因为MySQL使用文件系统的目录和文件来保存数据库和表的定义,大小写敏感性和具体的平台密切相关;在Windows中大小写是不敏感的,而在类Unix中则是敏感的不同存储引擎保存数据和索引的方式不同,但表的定义在MySQL服务层统一处理可以使用SHOW TABLE STATUS 命令显示表的相关信息。

2025-02-27 23:30:56 1010

原创 【MySQL原理系列】- MySQL基础

MySQL最重要、最与众不同的特性是其存储引擎架构,它将查询处理及其他系统任务和数据的存储/提取相分离。这种处理和存储分离的设计可以在使用时根据性能、特性,以及其他需求来选择数据存储的方式。本章概要地描述了MySQL的服务器架构、各种存储引擎之间的主要区别。

2025-02-27 23:24:54 626

原创 【Java高效并发系列】- 线程安全与锁优化

本章关注虚拟机如何实现“高效”,以及虚拟机对并发代码提供了什么样的优化手段高效并发,首先需要保证并发的正确性,然后在此基础上实现高效。

2025-02-27 23:05:57 699

原创 【Java高效并发系列】- Java与线程

从JDK 1.3起,“主流”平台上的“主流”商用Java虚拟机的线程模型普遍都被替换为基于操作系统原生线程模型来实现,以HotSpot为例,它的每一个Java线程都是直接映射到一个OS原生线程来实现(即1:1模型),虚拟机自己不会去干预线程调度,全权交给OS来处理。操作系统支持的轻量级进程则作为用户线程和内核线程之间的桥梁,这样可以使用内核提供的线程调度功能及处理器映射,并且用户线程的系统调用要通过轻量级进程来完成,大大降低了整个进程被完全阻塞的风险。线程调度是指系统为线程分配CPU使用权的过程。

2025-02-27 22:55:18 851

原创 【Java高效并发系列】- Java内存模型

Amdahl定律通过系统中并行化与串行化的比重来描述多处理器系统能获得的运算加速能力摩尔定律则用于描述处理器晶体管数量与运行效率之间的发展关系并发处理广泛应用,Amdahl定律代替摩尔定律,代表了近年来硬件发展从追求处理器频率到追求多核心并行处理的发展过程充分利用计算机处理器能力计算机的运算速度与其存储与通信子系统(磁盘IO、网络通信、数据库访问)速度差距过大不希望处理器处于空闲等待状态对于服务端,希望通过并发增加TPS。

2025-02-27 22:44:19 546

原创 【Java虚拟机系列】- Java虚拟机字节码执行引擎

局部变量表是建立在线程堆栈中的,属于线程私有的数据Java程序被编译为Class文件时,就在方法的Code属性的max_locals数据项中确定了该方法所需分配的局部变量表的。

2025-02-20 01:28:15 697

原创 【Java虚拟机系列】- Java虚拟机类加载机制

类加载器Class Loader:实现类的加载动作,该部分代码实现通过一个类的全限定名来获取描述该类的二进制字节流,在Java虚拟机外部实现任一类都必须由加载它的类加载器和该类自身一起确定其在JVM中的唯一性,比较两个类是否相等只有在它们都由同一类加载器加载的前提下才有意义;否则,即使这两个类来源于同一个Class文件,被同一个Java虚拟机加载,只要加载它们的类加载器不同,那这两个类就必定不相等模块化的关键目标——可配置的封装隔离机制模块将代码分解为更小、更独立的部分。

2025-02-20 01:22:59 912

原创 【Java虚拟机系列】- Class字节码文件结构

Class文件是一组以8字节为基础单位的二进制流,内无分隔符无空隙,对于需占用8字节以上空间的数据项,按照高位在前的方式分割为若干8字节进行存储(高位在前指高位字节在地址最低位来存储数据,SPARC、PowerPC大端存储,而x86小端存储)字节码是一种中间代码,由高级语言编译器编译而成,需要由特定虚拟机进一步编译为机器码,同样的字节码可以在支持相应虚拟机的任何平台运行,即平台无关性。常量池相当于Class文件里的资源仓库,是Class文件中与其他项目关联最多,占用Class文件空间最大的数据项目。

2025-02-20 01:07:06 588

原创 【Java虚拟机系列】- Java虚拟机垃圾收集器

为了能更好地适应不同程序的内存状况,HotSpot虚拟机并不是永远要求对象的年龄必须达到-XX:MaxTenuringThreshold才能晋升老年代,如果在Survivor空间中相同年龄所有对象大小的总和大于Survivor空间的⼀半,年龄大于或等于该年龄的对象就可以直接进入老年代,无须等到-XX:MaxTenuringThreshold中要求的年龄。在Java虚拟机中要避免大对象的原因是,在分配空间时,它容易导致内存明明还有不少空间时就提前触发垃圾收集,以获取足够的连续空间才能安置好它们;

2025-02-20 00:54:01 631

原创 【Java虚拟机系列】- 垃圾收集器与内存分配策略

在赋值前的部分的写屏障叫作写前屏障,在赋值后的则叫作写后屏障。堆和方法区的内存回收具有不确定性;一个接口的多个实现类需要的内存可能会不一样,一个方法所执行的不同条件分支所需要的内存也可能不一样,只有处于运行期间,我们才能知道程序究竟会创建哪些对象,创建多少个对象,这部分内存的分配和回收是动态的。在JDK 1.2版之前,Java里面的引用是很传统的定义:如果reference类型的数据中存储的数值代表的是另外一块内存的起始地址,就称该reference数据是代表某块内存、某个对象的引用。

2025-02-20 00:28:51 600

原创 【Java虚拟机系列】- Java内存区域与内存溢出异常

Java不同于C/C++,Java将内存管理的工作交给虚拟机自动完成,因此只有了解虚拟机的内存管理机制,才能在发生内存泄漏/内存溢出时解决问题。

2025-02-20 00:11:13 902

原创 【Java基础系列】- 反射机制

加载用户自定义类时会先找到其parent的class loader询问其该类有没有被加载,如果已经有同名的被加载了,则该自定义类就不会被加载(双亲委派机制)通过反射,Java可以在运行时加载和使用未知的类。:表示Java中的类和接口,通过反射机制可以动态地获取类的信息和操作类的成员。反射使得可以在运行时访问和修改对象的字段,即使这些字段在编译时未知。类是一个非常重要的类,它表示正在运行的Java应用程序中的类和接口。不是继承,继承指的是类之间的关系,在这说的是对象之间的关系。

2024-12-01 17:59:58 1691

原创 【Java基础系列】- 异常处理和IO流

继承自java.lang.Exception类或RuntimeException类来声明自己的异常在方法声明部分使用throws语句声明该方法可能抛出的异常重写方法需要抛出与原方法所抛出异常类型一致的异常或不抛出异常异常要先逮小的再逮大的class A{public void method() throws FileNotFoundException{} //错误!!异常类型不一致public void method(){} //正确,不抛出异常类型。

2024-12-01 16:52:11 753

原创 【Java基础系列】- 数组、常用类和容器

int size()装了多少元素清空是否包含(传的参数equals容器内某对象)添加一个删除一个用于对集合内元素进行迭代访问包含全部添加全部删除c在容器内全部求交集把容器内对象全转换为对象类型的数组。

2024-12-01 16:07:51 1472

原创 【Java基础系列】- 面向对象

用abstract关键字来修饰某类时,该类叫抽象类,修饰方法时叫抽象方法抽象类只需声明,而不需实现抽象方法在某方法不需要实现时使用,子类中要么继续抽象方法要么就重写,不然编译出错抽象类new不出来对象即不能被实例化,必须被继承抽象方法就是用来被子类进行重写的,若某类中有抽象方法则该类需标为抽象类Animal(String name){//构造方法System.out.println("叫声");}*///抽象方法,用于被子类重写,需要定义方便多态。

2024-12-01 13:55:35 636

原创 【Java基础系列】- Java入门

a取非,a&b与,a|b或,a^b异或(同0异1),a&&b短路与,a||b短路或(短路&&与||根据前面的判断条件可知结果一定时便会直接短路,不会算后面)如(i0)&&(k>8)分支:if语句:if () {} else if () {} else () {}, switch(i){case 0: 语句break;注意类型转换可以将占小空间的转换为大的(除了整型转浮点型会失精度外不会出问题),反过来需要进行强制类型转换,会溢出或降低精度(因为会把多出的字节直接舍了)

2024-11-29 23:56:12 1667 1

空空如也

空空如也

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

TA关注的人

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