自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 计算机系统要素 - 计算机体系结构构建计算机

1. 冯.诺依曼结构1.1 存储程序概念数字计算机最独特的特点在于其功能多样性,一个由有限硬件组件构成的计算机却可以执行无限的任务队列;计算机基于固定的硬件平台,能够执行固定的指令集,同时这些指令能被当成构建模块组成任意的程序;不同于1930年以前的机械计算机,这些程序的逻辑并没有被嵌入到硬件中,而是被存储到计算机的存储设备(memory)里,和数据一样,成为所谓的软件,由此,同样的硬件平台可以实现完全不同的功能1.2 冯.诺依曼结构冯诺依曼机是实际应用型的体系结构,他几乎是今天所有计算机平台的

2021-02-16 15:10:09 619 2

原创 计算机系统要素 - 计算机体系结构

1. 冯.诺依曼结构1.1 存储程序概念数字计算机最独特的特点在于其功能多样性,一个由有限硬件组件构成的计算机却可以执行无限的任务队列;计算机基于固定的硬件平台,能够执行固定的指令集,同时这些指令能被当成构建模块组成任意的程序;不同于1930年以前的机械计算机,这些程序的逻辑并没有被嵌入到硬件中,而是被存储到计算机的存储设备(memory)里,和数据一样,成为所谓的软件,由此,同样的硬件平台可以实现完全不同的功能1.2 冯.诺依曼结构冯诺依曼机是实际应用型的体系结构,他几乎是今天所有计算机平台的

2021-02-14 15:29:07 1473 1

原创 计算机系统要素 - 时序逻辑组成RAM

1. 时序逻辑布尔芯片和算数芯片都是组合芯片,组合芯片计算那些"输出结果仅依赖于其输入变量的排列组合"的函数,这些相关的简单的芯片提供很多重要的功能(像ALU那样),但是他们不能维持自身的状态;计算机不仅要能计算值,而且还要存取数据,因而这些芯片还必须配置记忆单元来保存数据,这些记忆单元是由时序芯片组成的;记忆单元的实现设计到同步,时钟和反馈回路,其中大部分能被封装到称为触发器的底层时序门中;2. 基本构建记住一些东西这个行为本质上是具有时间依赖性的现在记住的东西一定是之前的记忆,因此为了构建能

2021-02-10 17:24:48 1004

原创 计算机系统要素 - 布尔逻辑/布尔运算构建ALU

1.1 布尔门布尔门是对布尔函数的物理实现,简单的布尔门相互连接可以实现复杂芯片的功能1.1 布尔代数/布尔函数布尔代数处理布尔型(二进制型)数值布尔函数是指输入输出数值均为布尔型数值的函数计算机硬件基于二进制数据表示和处理,所以布尔函数在硬件体系结构的描述,构建和优化过程中扮演着十分重要的角色,如何正确地表达和分析布尔函数是迈向构建计算机体系结构地第一步每个布尔函数,不管有多复杂都可以只用三个布尔算子And,Or,Not来完全表示(在布尔中,我们处于有限的世界)比如对于下面的真值表..

2021-02-08 16:58:58 1488 1

原创 effective java - 创建和销毁对象

清晰性和简洁性最为重要 :组件的用户永远也不应该被其行为所迷惑组件要尽可能小,但又不能太小(组件”( Component),是指任何可重用的软件元素,从单个方法,到包含多个包的复杂框架, 都可以是一个组件)代码应该被重用,而不是被拷贝组件之间的依赖性应该尽可能地降到最小错误应该尽早被检测出来,最好是在编译时就发现并解决1. 用静态工厂方法代替构造器使用静态工厂方法代替构造器指的并不是涉及模式中的工厂模式,它仅仅是一个返回类的实例的静态方法,比如在Boolean类中public stati

2021-01-25 12:37:42 115

原创 序列化

1. 序列化基本概述对象序列化API提供了一个框架,用来将对象编码成字节流,并从字节流编码中重新构建对象;序列化:将一个对象编码成一个字节流反序列化:从字节流中恢复对象一旦对象被序列化后,他的编码就可以从一台正在运作的虚拟机传递到另一台虚拟机上,或者被存储到磁盘上,供以后反序列化时用序列化技术为远程通信提供了标准的线路级对象表示法,也为JavaBeans组件结构提供了标准的持久化数据结构2. 序列化的基本使用如果需要将某个对象保存到磁盘上或者通过网络传输,那么这个类应该实现Serializ

2021-01-23 10:50:03 119

原创 内部类详解

Java内部类详解1. 内部类基本概述内部类(inner class) 是定义在另一个类中的类,使用内部了有以下好处:内部类方法可以访问该类定义所在的作用域中的数据, 包括私有的数据内部类可以对同一个包中的其他类隐藏起来每个内部类都能独立的继承一个接口的实现,所以无论外部类是否已经继承了某个(接口的)实现,对于内部类都没有影响。内部类使得多继承的解决方案变得完整方便将存在一定逻辑关系的类组织在一起,又可以对外界隐藏方便编写事件驱动程序当想要定义一个回调函数且不想编写大量代码时,使用匿名(a

2021-01-21 15:27:36 117 1

原创 程序中我是怎么处理金额的

1. 概述对于金额的存储说起来实际有很多问题,比如能不能用浮点类型做金额的计算,在应不应该把计算好的最终金额结果直接set到数据库等等2. 浮点类型2.1 float vs double浮点类型用于表示有小数部分的数值,在java中有两种浮点类型类型存储要求取值范围float4字节有效位数为6-7位double8字节有效位数为15位double表示这种类型的数值精度是float类型的两倍;绝大部分应用程序都采用double类型,很多情况下,float类型的

2021-01-20 22:05:58 407

原创 Netty

1. 基本概述1.1 什么是NettyNetty是异步的,基于事件驱动的网络应用框架,用以快速开发高性能,高可靠的网络IO程序,本质是对java的io的优化重写事件驱动: 有相应的事件发生才会去处理,不会一直阻塞等待,通常我们设置一个事件处理模型的程序有两种思路轮询方式:线程不断轮询访问相关事件发生源有没有事件发生,有发生事件就调用事件处理逻辑事件驱动方式:发生事件,主线程把事件放入事件队列,在另外线程不断循环消费事件列表中的事件,调用事件对应的处理逻辑处理事件,事件驱动方式也称为消息通知方式

2021-01-12 11:41:41 136 1

原创 NIO

攻破JAVA NIO技术壁垒Java NIO 的前生今世 之四 NIO Selector 详解1. 基本介绍Java NIO :同步非阻塞,服务器实现模式为一个线程处理多个请求(连接),即客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有I/O请求就进行处理NIO非阻塞式IO--使用Channel代替Stream--使用Selector监控多条Channel,由于Channel的读的方法可以是非阻塞的,所以我一直监控Channel的数据是否准备好--可以在一个线程处理Chan

2021-01-11 11:35:16 161

原创 BIO - 同步并阻塞

1. 基本介绍BIO 是传统的java io 编程,其相关的类和接口在 java.ioBIO(blocking I/O) :同步阻塞,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理如果这个连接不做任何事情会造成不必要的线程开销,可以通过线程池机制改善(实现多个客户连接服务器)BIO方式适用于连接数目比较小且固定的架构,这种方式对服务器资源要求比较高,并发局限于应用中,JDK1.4以前的唯一选择,程序简单易理解2. BIO编程简单流程① 服务器端启动

2021-01-11 09:30:56 459

原创 Array转List&List转Array

//Array转listpublic class Test { public static void main(String[] args) { String[] myArray = { "Apple", "Banana", "Orange" }; List<String> myList = new ArrayList<String>(Arrays.asList(myArray)); myList.add("Guava"); }}

2021-01-06 15:38:23 110

原创 Mysql 查询性能优化

1. 查询优化基本概述在Mysql 基础架构中提到Mysql整体由服务层和引擎组成,服务层涵盖mysql的大多数核心服务功能,所有跨存储引擎的功能都在这一层实现,包括存储过程,触发器,视图等,以及所有的内置函数,而存储引擎层负责数据的存储和提取;一条sql查询语句按下面几步执行客户端发送一条查询给服务器。服务器先检查查询缓存,如果命中了缓存,则立刻返回存储在缓存中的结果。否则 进入下一阶段服务器端进行SQL解析、预处理,再由优化器生成对应的执行计划MySQL根据优化器生成的执行计划,调用存储引

2020-12-29 14:32:39 537

转载 背包问题

背包问题有 n 个物品和容量为 V 的背包,第 i 件物品的体积为 c[i],价值为 w[i]。现在的目标是确定要将哪些物体放入背包,以保证在体积 不超过背包容量 的前提下,背包内的 总价值最高?1. 01背包问题约束条件: 每种物品数量为 1,可以选择放或不放状态定义: f[i][v] 为前 i 个 物品中,体积恰好为 v 时的最大价值。result = max(f[n][0~V]) 即最终答案,它表示前 n 个物品的最大价值,假设这时容量为 k ,由于 0 <= k <= V,因此

2020-12-28 16:31:29 243

原创 Mysql 索引优化

1. 创建高性能索引正确的创建和使用索引是实现高性能查询的基础MySQL优化(5):索引失效分析、in与exists使用场合 - 湮天霸神666 - 博客园① 全值匹配我最爱② 最左前缀要遵循查询从索引的最左列开始(带头大哥不能死)不能跳过索引中的列(中间兄弟不能断)③ 不在索引列上做任何的操作导致索引失效而转向全表扫描④ 范围之后全失效存储引擎不能使用索引中范围条件右边的列age用到了,用于range操作,确定范围pos用不到⑤ 尽量少用"*"尽量使用覆盖索引

2020-12-28 11:15:38 128

原创 Mysql 锁理论

MySQL 锁机制(上) – 全局锁与表级锁MySQL 锁机制(下) – 细说 InnoDB 行锁(记录锁、间隙锁与临键锁)1. 概述数据库锁设计的初衷是为了处理多用户共享资源时的并发问题;Mysql不同的存储引擎支持不同的锁机制,所有的存储引擎都以自己的方式实现了锁机制,服务层完全不了解存储引擎中的锁的实现MyISAM和MEMORY存储引擎采用的是表级锁BDB存储引擎采用的是页面锁,但也支持表级锁InnoDB存储引擎支持行级锁,也支持表级锁,默认情况下使用的是行级锁2. 全局锁2.1

2020-12-27 11:00:47 116

转载 Mysql ACID

ACID的实现Atomicity 原子性Consistency 一致性Isolation 隔离性Duration 持久性1. 原子性1.1 基本概述一个事务中的操作要么全部成功,要么全部失败;所以保证原子性的关键点在于如何在事务执行失败的时候撤销之前执行了的操作1.2 通过undo log实现原子性undo log与redo log一起构成了Mysql事务日志,事务中每一次修改,InnoDB都会先记录对于的undo log记录与redo log记录的物理页的修改不同,undo log

2020-12-25 11:41:22 72

原创 Mysql 事务

1. 概述事务就是要保证一组数据库操作,要么全部成功,要么全部失败在 MySQL 中,事务支持是在引擎层实现的:MySQL 是一个支持多引擎的系统,但并不是所有的引擎都支持事务,比如 MySQL 原生的 MyISAM 引擎就不支持事务,这也是 MyISAM 被 InnoDB 取代的重要原因之一1.2 事务的启动方式set autocommit=1,会开启自动提交,这个时候也可以使用显示启动事务语句,begin 或 start transaction。配套的提交语句是 commit,回滚语句是 ro

2020-12-24 21:28:17 121 1

原创 Mysql 日志系统

bin-log & redo-log & undo log1. 避免从删库到跑路 - bin log怎么避免从删库到跑路 – 详解 mysql binlog 的配置与使用1.1 什么是bin logbinlog 即二进制日志,他记录了引起或可能引起数据库改变事件,包括事件发生的时间、开始位置、结束位置等信息,select、show 等查询语句不会引起数据库改变,因此不会被记录在 binlog 中对于事务的执行,只有事务提交时才会一次性写入 binlog,对于非事务操作,则每次语

2020-12-24 13:27:37 126

原创 Mysql 基础架构

基础架构:一条SQL查询语句是如何执行的?日志系统:一条SQL更新语句是如何执行的?1. 概述mysql可以分为Service层和存储引擎层Service层(上图中间的一层)涵盖mysql的大多数核心服务功能,所有跨存储引擎的功能都在这一层实现,包括存储过程,触发器,视图等,以及所有的内置函数(如日期,时间,数字和加密函数等)存储引擎层(插件式)负责数据的存储和提取,支持InnoDB,MyISAM,默认使用InnoDB,可以在建表的时候指定存储引擎2. 一条sql查询语句是怎么执行的①

2020-12-24 11:24:46 300

原创 计算机网络 - 网络层

1. 网络层概述有了ethernet、mac地址、广播的发送方式,世界上的计算机就可以彼此通信了,问题是世界范围的互联网是由一个个彼此隔离的小的局域网组成的,那么如果所有的通信都采用以太网的广播方式,那么一台机器发送的包全世界都会收到,这就不仅仅是效率低的问题了,这会是一种灾难因此,必须找到一种方法,能够区分哪些MAC地址属于同一个子网络,哪些不是。如果是同一个子网络,就采用广播方式发送,否则就采用"路由"方式发送。("路由"的意思,就是指如何向不同的子网络分发数据包,这是一个很大的主题,本文不涉及。

2020-12-22 11:13:42 1434

原创 计算机网络 - TCPvsUDP

1. 传输层概述网络层的ip帮我们区分子网,以太网层的mac帮我们找到主机,但我们实际使用的是设备上的程序(QQ,微信…),两个主机进行通信实际上就是两个主机中的应用进程互相通信在 TCP/IP 协议中能够实现传输层功能的,最具代表性的就是 TCP 和 UDPTCP:传输控制协议(TCP,Transmission Control Protocol),TCP 为应用层提供了一种可靠的、面向连接的服务,它能够将分组可靠的传输到服务端UDP:用户数据报协议(UDP,User Datagram Protoc

2020-12-21 22:13:53 1122

原创 计算机网络 - 应用层

1. 应用层概述应用层(application-layer)的任务是通过应用进程间的交互来完成特定网络应用。应用层协议定义的是应用进程(进程:主机中正在运行的程序)间的通信和交互的规则。对于不同的网络应用需要不同的应用层协议。在互联网中应用层协议很多,如域名系统 DNS,支持万维网应用的 HTTP 协议,支持电子邮件的 SMTP 协议等等。我们把应用层交互的数据单元称为报文应用层必知必会协议HTTP超文本传输协议HTTPSDNS域名系统DHCP动态主机配

2020-12-21 10:50:36 1515

原创 计算机网络 - 自底向上

1. 分层模型1.1 层次结构设计的基本原则各层次之间相互独立每一层要有足够的灵活性各层之间完全解耦,当前层的变化不影响其他层的使用1.2 OSI7层模型1.3 TCP/IP五层模型由于以下原因,我们没有使用OSI模型OSI是基于理论的,缺乏实际的经验OSI标准指定周期过长,按照OSI标准生产的设备无法及时的进入市场OSI模型设计的并不合理,一些功能在多层重复出现2. 物理层孤立的计算机之间要想完成通信,计算机之间必须完成组网,可以使用光缆、电缆、双绞线、无线电波等方式

2020-12-20 21:39:44 1045

原创 计算机网络-我家是怎么上网的?

现在的网络结构和上图的类似,主要核心是由猫,路由器和其他设备组成的如何使用宽带上网Wlan和WIFI的区别是什么?光猫和路由器有什么区别?光猫路由器傻傻分不清,家里有了光猫,路由器还有必要吗? 光猫都是有路由器的功能的 能不能不用路由器直接用光猫做WiFi计算机网络中的路由器与家里用的路由器是一个概念么?1. 为了上网首先需要去找到运营商(ISP:Internet Service Provider 网络服务提供商)开通网络,也就是开通宽带为什么需要找他们开通宽带?现代互联网的网络拓扑是由.

2020-12-20 11:54:50 2044 3

原创 HashMap源码

1. 基本介绍1.1 什么是hash重温数据结构:哈希 哈希函数 哈希表equals和hasCode方法我们通常使用数组或者链表来存储元素,一旦存储的内容数量特别多,需要占用很大的空间,而且在查找某个元素是否存在的过程中,数组和链表都需要挨个循环比较,而通过哈希计算,可以大大减少比较次数1.2 什么是HashMapHashMap是采用了哈希表实现的键值对集合,HashMap 的特殊存储结构使得在获取指定元素前需要经过哈希运算,得到目标元素在哈希表中的位置,然后再进行少量比较即可得到元素,这使得

2020-12-16 14:53:00 163 1

原创 平衡二叉树

平衡二叉树1. AVL树概述AVL树的名字来源于它的发明作者G.M. Adelson-Velsky 和 E.M.Landis。AVL树是最先发明的自平衡二叉查找树(Self-Balancing Binary Search Tree,简称平衡二叉树)。平衡二叉树定义(AVL): 它或者是一颗空树,或者具有以下性质的二叉排序树:它的左子树和右子树的深度之差(平衡因子)的绝对值不超过1,且它的左子树和右子树都是一颗平衡二叉树一棵AVL树有如下必要条件:条件一:它必须是二叉查找树。条件二:每个节

2020-12-15 21:41:26 136

原创 TreeSet& TreeMap

//TODO

2020-12-13 15:12:39 42

原创 JUC - 为了线程安全 - 成熟工具类 - 原子类

1. 什么是原子类原子类的作用类似于锁,是为了保证并发情况下线程安全,不过原子类相对于锁有一定的优势:粒度更细:原子变量可以把竞争范围缩小到变量级别效率更高:通常使用原子类效率更高类型原子类Atomic*基本类型原子类AtomicInteger/AtomicLong/AtomicBooleanAtomic*Array数组类型原子类AtomicIntegerArray/AtomicLongArray/AtomicReferenceArrayAtomic*Refe

2020-12-11 11:14:14 479

原创 JUC - 管理线程提高效率 - 线程池

1. 线程池的重要性1.1 对于操作系统来说在操作系统创建线程、切换线程状态、终结线程都要进行CPU调度,进行上下文切换,这是一个耗费时间和系统资源的事情。大多数实际场景中是这样的:处理某一次请求的时间是非常短暂的,但是请求数量是巨大的。这种技术背景下,如果我们为每一个请求都单独创建一个线程,那么物理机的所有资源基本上都被操作系统创建线程、切换线程状态、销毁线程这些操作所占用,用于业务请求处理的资源反而减少了所以最理想的处理方式是,将处理请求的线程数量控制在一个范围,既保证后续的请求不会等待太长时间

2020-12-09 10:25:15 242

原创 并发编程 - 基础

1.1 进程和线程的定义进程:具有一定独立功能的程序关于某个数据集合上的一次运行活动,**进程是系统进行资源分配和调度的一个独立单位.**每个进程都有独立的代码和数据空间(进程上下文),进程间的切换会有较大的开销,一个进程包含1–n个线程。(进程是资源分配的最小单位)线程:线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进

2020-12-08 22:06:47 62

原创 线程安全问题 - 发布与逸出

1. 逸出① private对象的逸出/** * 描述: 发布逸出 */public class MultiThreadsError3 { private Map<String, String> states; public MultiThreadsError3() { states = new HashMap<>(); states.put("1", "周一"); states.put("2",

2020-12-08 21:25:36 140

原创 Java内存模型和底层原理

1. 什么是JMMJMM:Java Memory Model,其实JMM并不像JVM内存结构一样是真实存在的。他只是一个抽象的概念;1.1 JMM是一组规范JMM是和多线程相关的,他描述了一组规则或规范,需要各个JVM的实现来遵守JMM规范,以便于开发者可以利用这些规范,更方便的开发多线程程序;如果没有这样的一个JMM内存模型来规范,那么很可能经过了不同JVM的不同规则的重排序以后,导致不同的虚拟机上运行的结果不一样,正是由于有了JMM,Java的并发编程才能避免很多问题。Java的内存模型不仅受

2020-12-07 21:43:35 299

原创 并发编程 - Thead和Object类中线程相关的方法

类方法名简介Threadsleep相关join等待其他线程执行完毕yield相关放弃已经获得到的CPU资源currentThread获取当前执行线程的引用start,run相关启动线程开关stop,suspend,resume相关已废弃Objectwait/notify/notifyAll让线程暂时休息和唤醒1. wait/notify/notifyAllwait/notify/notifyAll2. sleep...

2020-12-07 11:26:30 95

原创 生产者和消费者模式

1. 使用wait实现生产者消费者模式/** * 描述: 用wait/notify来实现生产者消费者模式 */public class ProducerConsumerModel { public static void main(String[] args) { EventStorage eventStorage = new EventStorage(); Producer producer = new Producer(eventStorage);

2020-12-07 09:47:37 56

原创 并发编程 - 线程的生命周期

new -> runnable(对应操作系统的ready和running两种状态) -> blocked(被阻塞,要进入synchronized代码但是拿不到锁) -> waiting(等待) -> timed waiting(计时等待) -> terminated public enum State { /** * Thread state for a thread which has not yet started.

2020-12-06 21:05:24 91

原创 并发编程 - 创建多线程的方法以及线程的启动与停止

1. 官方回答Oracle官方文档的描述是这样的There are two ways to create a new thread of execution. One is to declare a class to be a subclass of Thread. This subclass should override the run method of class Thread. An instance of the subclass can then be allocated and sta

2020-12-06 14:41:37 199

原创 Redis - 企业级解决方案

1. 缓存预热缓存预热就是系统启动前,提前将相关的缓存数据直接加载到缓存系统。避免在用户请求的时候,先查询数据库,然后再将数据缓 存的问题!用户直接查询事先被预热的缓存数据!2. 缓存雪崩大量的key设置了相同的过期时间,导致在缓存在同一时刻全部失效,造成瞬时DB请求量大、压力骤增,引起雪崩解决方案可以给缓存设置过期时间时加上一个随机值时间,使得每个key的过期时间分布开来,不会集中在同一时刻失效。3. 缓存击穿一个存在的key,在缓存过期的一刻,同时有大量的请求,这些请求都会击穿到DB,造成

2020-12-04 11:22:38 90

原创 Redis - 主从复制

1. 单机Redis是否高可用?1.1 单机redis的风险与问题机器故障现象:硬盘故障、系统崩溃本质:数据丢失,很可能对业务造成灾难性打击结论:基本上会放弃使用redis.问题2.容量瓶颈现象:内存不足,从16G升级到64G,从64G升级到128G,无限升级内存本质:穷,硬件条件跟不上结论:放弃使用redis结论为了避免单点Redis服务器故障,准备多台服务器,互相连通。将数据复制多个副本保存在不同的服 务器上,连接在一起,并保证数据是同步的。即使有其中一台服务器宕机,其他服

2020-12-02 21:02:50 149

原创 Redis数据类型

java string hash list set zset1. string1.1 简介string是redis最基本的类型,一个key对应一个value。string类型是二进制安全的。意思是redis的string可以包含任何数据。比如jpg图片或者序列化的对象string类型是Redis最基本的数据类型,一个键最大能存储512MB。二进制安全特点:二进制安全是指,在传输数据时,保证二进制数据的信息安全,也就是不被篡改、破译等,如果被攻击,能够及时检测出来① 编码、解码发生在客户端完成

2020-12-02 09:33:00 87

空空如也

空空如也

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

TA关注的人

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