invokedynamic的指鹿为马是如何实现的?

鸭子呱呱叫在Go语言中, 我们有鸭子类型的这一种说法, 也就是看起来像马的, 都是可以被当做马的。 123type House interface { run();} JVM底层是如何做的呢?Java引入一个专门的指令叫做invokedynamic, 该指令的调用机制抽象出了调用点这个概念, 并允许将调用点链接到任意符合条件的方法...

阅读全文

no-title

ZooKeeper是什么? 它是一个分布式的协调中心, 也称之为注册中心 我们的 ZooKeeper 集群不是 Leader 负责写,写成功后不是同步到各个 Follower 从节点吗?那么问题来了,如果这时候 Leader 挂了,Follower 会进行选举,但是选举也需要时间的,选举过程中如果进来了读写请求,那么是无法进行的。所以会有部分流量的丢失,...

阅读全文

no-title

在很多的面试八股文中, 往往会考察关于进程和线程的区别 这道题目的基本解法也就是下面这个答案: 进程是操作系统资源分配的基本单位, 而线程是任务调度和执行的基本单位 系统在运行的时候会为每个进程分配不同的内存空间, 而对线程而言, 除了CPU外, 系统不会为线程分配内存, 线程之间只能共享资源 每个进程都有自己的独立内存空间, 当一个进程崩溃的时候, 其内...

阅读全文

no-title

事件风暴建模方法之前在DDD中学习过事件风暴建模方法, 但是并没有对其进行总结, 这篇文章就是用来对此进行总结的

阅读全文

Java网络编程

几种IO模式首先我们需要弄明白几种IO模型, 关于基础知识这块我觉得已经说臭了:)。 首先说同步IO, 同步IO指的是, 你需要不断的监控资源的状态, 如果资源是可读或者可写的, 那么就会读, 如果资源不可以读或者写, 就会出现下面两种情况: BIO:指的是阻塞IO, 读取不到数据, 会阻塞当前线程, 比如sleep(100) NIO:指的是非阻塞IO,...

阅读全文

函数式编程的常见误区

1. 最后一行为什么作为返回值?返回值这种说法并不是很好, 它应该叫做结果值, 因为函数式编程的核心为一切都是表达式, 一切都是表达式求值的结果, 而函数就是作为一种表达式被求值, 那么最后一行就是整个函数求值之后的结果。 1expr = x => x 观察上面这个表达式x, 这个表达式其实就是变量x, 所以变量也是一种表达式。 2. 到底什么是真...

阅读全文

Go语言错误处理

错误处理实践我们在go语言中设计error的处理体系时候, 一般都会去做下面两点 直接使用errors.New()生成error接口的值 扩展error接口, 并定义扩展error接口的实现类型 error接口是什么?go语言的error是一个接口类型, 其源码如下: 123type error interface { Error() stri...

阅读全文

值放在栈上还是堆上

值放在栈上还是堆上?很多初学者经常在学编程语言中,总是会有这样的误解, 认为值类型放在栈上, 引用类型放在堆上面,这种方式就相等于考试背诵答案 下面的代码以rust为例子, 但是不会涉及到太多 1let str = "hello, world".to_string(); 首先”hello, world”作为一个常量, 在编译的时, 会放...

阅读全文

JavaScript的面向对象详解

JavaScript的面向对象一个复杂的体系, 涉及到非常多, 从最初的类抄写, 函数作为类, 到原型链, 到ES6的Class设计。 这里先挖一个坑 慢慢填, 同时本文也要写上tl, :) 一、早期JavaScript(1.0~1.3)的对象,类, 构造器, new对象: 对象是0~多个属性的集合, ECMAScript, an object is a ...

阅读全文

Y Combinator

前言我第一次听说Y combinator是在程序语言理论与设计原理这门课程, 同时也是第一次知道lambda演算和图灵机是完全等价的, 但是lambda演算的优雅程度图灵机是完全无法和lambda演算相提并论的。 看懂这篇文章的基础 知道什么是高阶函数: 函数可以作为值传递, 也就是常说的lambda表达式 知道$$Curry$$这样参数风格:$$\lamb...

阅读全文