摘要: 这次不以面试背题为目的,挑几个源码实现中值得玩味的点来分析一下。 首先看几个初始化参数,在实现中 Lea 大爷大量的使用了二进制位移运算。比如 16 表示为 1<<4 ,1 073 741 824 表示为 1<<30 。由于计算机的物理特性,二进制运算的效率尤其是位移运算是高于直接使用十进制运算的。 阅读全文
posted @ 2020-07-27 15:58 牛有肉 阅读(692) 评论(1) 推荐(0) 编辑
摘要: JS 是单线程的。 JS 是一门解释型脚本语言,主要用于处理浏览器与用户的交互。 个人认为设计为单线程的考量在于: 1、绝大多数交互相关的任务都是 CPU 密集型的短任务,任务耗时短、CPU 占用率高。若使用多线程,线程调度开销占总开销的百分比过大,收益不高。 2、要频繁的处理 DOM 元素。在所有 阅读全文
posted @ 2020-07-23 22:39 牛有肉 阅读(237) 评论(0) 推荐(0) 编辑
摘要: 如果我们要将一个文件通过 socket 发送出去,我们一般会这样写: Socket socket = new Socket(); socket.connect(new InetSocketAddress("127.0.0.1", 33456),10 * 1000); DataOutputStream 阅读全文
posted @ 2020-04-20 14:02 牛有肉 阅读(458) 评论(0) 推荐(0) 编辑
摘要: 想要理解多路复用技术,首先要了解这个技术出现之前,我们面临的痛点是什么。 以 JAVA 为例,我们想要写一个 TCP 服务端,接收客户端发来的数据,那么我们会这样写: while (true) { Socket socket = serverSocket.accept(); //读取输入缓冲区数据 阅读全文
posted @ 2020-04-14 23:57 牛有肉 阅读(548) 评论(0) 推荐(1) 编辑
摘要: 在使用微服务的过程中,RPC 是永远绕不开的点。之前并没有磕的很深,一直觉着 RPC 是一个黑魔法。比如我们常用的 Dubbo、SpringCloud 等框架,将微服务模块间的方法调用封装的像本地方法调用一样,方便又令人费解。 今天如愿以偿的仿照 Dubbo 自己手写了一个 rpc “框架”,虽然简 阅读全文
posted @ 2020-03-24 11:27 牛有肉 阅读(515) 评论(0) 推荐(0) 编辑
摘要: 前面的博客 基于 socket 手写一个 TCP 服务端及客户端 写过一个简单的 TCP 服务端客户端,没有对代码结构进行任何设计,仅仅是实现了相关功能,用于加深对 socket 编程的认识。 这次我们对整个代码结构进行一下优化,使其模块化,易扩展,成为一个简单意义上的“框架”。 对于 Socket 阅读全文
posted @ 2020-03-22 18:44 牛有肉 阅读(680) 评论(0) 推荐(0) 编辑
摘要: 池化是我们在实际生产中经常用到的一种思想,通过一个 “池” 把资源统一的管理起来。可以达到对资源的合理管理、重复利用、减少资源创建/销毁的开销等目的。 常见的比如常量池、连接池、线程池,今天我们手撸一个线程池。 抛开语言特性,线程池无非是维护一堆线程阻塞等待任务的到来,并由主线程对任务线程的数量进行 阅读全文
posted @ 2020-03-14 23:33 牛有肉 阅读(3584) 评论(0) 推荐(0) 编辑
摘要: 数据一致性部分借用大神“耗叔”的博客:https://coolshell.cn/articles/20793.html。 总结:volatile 关键字通过内存屏障禁止了指令的重排序,并在单个核心中,强制数据的更新及时更新到缓存。在此基础上,依靠多核心处理器的缓存一致性协议等机制,保证了变量的可见性 阅读全文
posted @ 2020-03-02 19:00 牛有肉 阅读(3474) 评论(2) 推荐(2) 编辑
摘要: 文章篇幅较长,知识点涵盖比较广泛,作为学习 JS 的一个总结。文章中仅涵盖 ES5 及之前的传统的知识点,未涵盖 ES6 及之后的新特性。 JavaScript(简称“JS”) 是一种具有函数优先的轻量级,解释型或即时编译型的编程语言。虽然它是作为开发Web页面的脚本语言而出名的,但是它也被用到了很 阅读全文
posted @ 2020-02-04 17:54 牛有肉 阅读(494) 评论(0) 推荐(1) 编辑
摘要: 前言 学习 λ 演算的初衷是为了更好的使用 JAVA8 的 lamda表达式,但是在学习过程中发现 λ 演算的作用和深度远远比想象的大的多得多。λ 演算的定义并不复杂,包括一条变换规则(变量替换)和一条函数定义方式,但其外延却囊括和渗透到了无数方向,乃至学习过程中脑中不断冒出一句话:内涵越小、外延越 阅读全文
posted @ 2020-01-31 21:50 牛有肉 阅读(1184) 评论(0) 推荐(1) 编辑
摘要: 《深入理解计算机系统》学习笔记与总结 首先一个大的总结:在计算机中,使控制流发生突变的源头被称为异常控制流。异常是分为多个层级的,硬件异常与软件异常。我们在讨论异常的处理时也应该分情况讨论。异常控制流存在的逻辑是:我们的程序除了需要对程序内部状态的变化做出反应外,也应该可以对系统状态的变化做出反应。 阅读全文
posted @ 2019-12-25 20:49 牛有肉 阅读(2295) 评论(0) 推荐(1) 编辑
摘要: 时序电路 首先来看两个问题: 1.为什么CPU要用时序电路,时序电路与普通逻辑电路有什么区别。 2.触发器、锁存器以及时钟脉冲对时序电路的作用是什么,它们是如何工作的。 带着这两个问题,我们从头了解一下逻辑电路。要了解逻辑电路,首先我们便要了解组成逻辑电路的基本单位:逻辑门。 逻辑门 逻辑门是数字电 阅读全文
posted @ 2019-12-21 00:13 牛有肉 阅读(2923) 评论(2) 推荐(2) 编辑
摘要: 第一节 哲学家就餐问题 第二节 什么是死锁 第三节 死锁的定义 第四节 死锁发生的条件 第五节 如何避免死锁 5.1 动态避免,银行家算法(杠杆分配),在资源分配上下文章 5.2 静态避免,从任务代码上避免死锁 第六节 死锁的综合治理 第一节 哲学家就餐问题 假设有五位哲学家围坐在一张圆形餐桌旁,做 阅读全文
posted @ 2019-12-08 22:25 牛有肉 阅读(3786) 评论(1) 推荐(6) 编辑
摘要: 这道题目做了两个晚上,发现解题思路的优化过程非常有代表性。文章详细说明了如何从回溯解法改造为分治解法,以及如何由分治解法过渡到动态规划解法。解法的用时从 超时 到 超过 95.6% 提交者,到超过 99.8% 提交者。现整理下来分享给大家,如有错误评论区欢迎指正! 题目如下: 回溯法 刚看到这个题目 阅读全文
posted @ 2019-12-02 14:58 牛有肉 阅读(2874) 评论(4) 推荐(4) 编辑
摘要: 前言 中断的概念属于硬件层。虽然在进行软件编程时不会直接使用中断,但理解它对我们来说依然重要。 在使用线程切换及状态管理、异常处理、硬件与处理器的交互、I/O操作等指令时,中断都在默默的服务。 处理器基于硬件封装对外的指令集,底层语言封装指令集提供更加简单的抽象,高级语言基于底层语言赋予程序更明确的 阅读全文
posted @ 2019-11-21 19:50 牛有肉 阅读(13562) 评论(0) 推荐(5) 编辑
摘要: 需要注意图中存在环路。 JAVA: public final Node cloneGraph(Node node) { return deepCopy(node, new HashMap<Integer, Node>()); } private Node deepCopy(Node node, Ha 阅读全文
posted @ 2023-11-10 11:22 牛有肉 阅读(9) 评论(0) 推荐(0) 编辑
摘要: 因为数组是有序的,可以递归的选取根节点构建子树。 JAVA: public final TreeNode sortedArrayToBST(int[] nums) { if (null == nums) return null; return this.build(nums, 0, nums.len 阅读全文
posted @ 2023-11-09 15:25 牛有肉 阅读(8) 评论(0) 推荐(0) 编辑
摘要: 总结 1、write skew 问题,是基础版多版本并发控制方案,在版本提交时,只处理了 写 - 写 冲突,而未处理存在控制依赖关系的 读 - 写 冲突。 2、对于相同数据的写入操作保证了并发安全,但当该写入操作依赖的数据,被其他事务修改的情况发生时,就会出现并发问题。 3、对于一个事务涉及的数据全 阅读全文
posted @ 2023-06-28 10:26 牛有肉 阅读(169) 评论(0) 推荐(0) 编辑
摘要: 解析方法调用的语法,支持常量(双引号包含)、变量、函数(嵌套调用)作为入参。 自动机: java实现: // 方法执行 public String excuteMethod(String expression, JSONObject formData) throws Exception { if ( 阅读全文
posted @ 2023-04-26 14:32 牛有肉 阅读(19) 评论(0) 推荐(0) 编辑
摘要: 自定义逻辑表达式,关键字:= 等于,& 与,| 或, !非, ( , ) ,<> 包含,>< 不包含, # 不等于。 表达式支持括号标识作用域。 自动机分析如下: JAVA 实现: public class ConditionAnalysis2 { // 终止符号 Set<Character> si 阅读全文
posted @ 2023-02-27 22:58 牛有肉 阅读(55) 评论(0) 推荐(0) 编辑
摘要: 自定义逻辑表达式,关键字:"="等于,"&"与,"|"或,"(",")","<>"包含,"><"不包含,"#"不等于。 表达式支持括号标识作用域。 自动机分析如下: JAVA 代码实现: public class ConditionAnalysis { public static void main 阅读全文
posted @ 2023-02-24 19:59 牛有肉 阅读(45) 评论(0) 推荐(0) 编辑
摘要: 根据建表语句解析表结构,并将表结构解析为JSON。根据MYSQL的建表语句, 建表语句: CREATE TABLE `TEST` ( `ID` varchar(56) NOT NULL, `CREAETE_TIME` datetime NOT NULL, `IS_DEL` varchar(6) NO 阅读全文
posted @ 2023-02-16 18:15 牛有肉 阅读(244) 评论(0) 推荐(0) 编辑
摘要: 解法主要有两项工作: 1、处理作用域(栈或递归); 2、顺序处理逻辑:(1)根据分隔符将语句拆解为 token;(2)根据关键字的运算逻辑定义状态,设计自动机;(3)从左至右逐个解析 token ,将 token 压入自动机 程序处理时,先处理会引起自动机状态变更的关键字或字符,再处理 token, 阅读全文
posted @ 2023-02-15 23:46 牛有肉 阅读(35) 评论(0) 推荐(0) 编辑
摘要: 从 GitHub 下载对应版本的 IK 分词器源码,修改 CharacterUtil.identifyCharType 方法,将特殊符号、标点符号当做中文进行处理即可。 添加: //驼峰作为分词点 if (input >= 'A' && input <= 'Z') return CHAR_CHINE 阅读全文
posted @ 2023-01-16 19:31 牛有肉 阅读(598) 评论(0) 推荐(0) 编辑
摘要: 倒排索引的简单 JAVA 实现,当玩具其实都很粗糙,简单实现下原理: public class IntertedIndex { // 倒排索引 private Map<String, List<String>> indexMap; // 关键词计数 private Map<String, Integ 阅读全文
posted @ 2023-01-09 13:50 牛有肉 阅读(437) 评论(0) 推荐(0) 编辑