nekolr's blog

爱吃咖喱棒的打字员DA☆ZE~

一个最简单的 RPC 需要满足几个基本的要求。首先是通信,一般可选的有 HTTP 和 TCP,这里选择 TCP,直接使用 Java Socket 处理通信。然后就是寻址,也就是如何找到要调用的方法。这里根据服务消费者提供的基本调用信息,然后利用 Java 的反射机制进行调用。服务消费者在进行远程调用时就像调用本地方法一样的效果则依靠 Java 的动态代理机制来实现。最后是参数序列化和反序列化,这里使用最简单的 Java 原生的序列化机制。

Read more »

虚拟机把描述类的数据从 Class 文件加载到内存,并对数据进行校验、解析和初始化,最终形成可以被虚拟机直接使用的 Java 类型,这就是虚拟机的类加载机制。Java 类型的加载、连接和初始化都是在程序运行期间完成的,这种方式虽然会增加类加载时的性能开销,但是能够为 Java 应用提供更好的灵活性,Java 天生可以动态扩展的语言特性就是依靠运行期动态加载和动态连接这个特点实现的。例如,我们编写一个面向接口的应用,可以等到运行时再指定它的实现类;我们可以通过 Java 预定义的或者我们自定义的类加载器,从网络或者其他地方加载一个二进制的流作为应用程序代码的一部分。

Read more »

代理模式也叫做委托模式,许多其他的模式,比如状态模式、策略模式、访问者模式等本质上都是在更加特殊的场景中采用了委托模式。有时候我们可能会把代理模式与装饰器模式搞混,简单来说,装饰器模式更加专注于向对象动态地添加或增强功能,而代理模式则更专注于控制对对象的访问。装饰器模式强调的是增强自身,在被装饰之后你能够在被增强的类上使用增强后的功能,但是增强后的你还是你,只不过能力更强了而已。代理模式则强调要让别人帮你去做一些与你本身没有太大关联的职责,比如记录日志、设置缓存等。

Read more »

好久不用 MyBatis,都快忘了怎么使用了,重新看一遍文档并简单记录下来,方便下次查阅。

Read more »

应用程序与数据库软件进行交互可以有多种方式,其中常见的就是 JDBC 和 ODBC,它们都是在 X/Open SQL CLI(Call Level Interface)的基础上完成,但是 JDBC 更适合在 Java 应用中使用。JDBC 提供了一套用于 Java 程序与 DBMS 进行交互的 API,即只是制定了这个规范,具体的实现则交给了不同的数据库软件厂商。

Read more »

我们知道,HashMap 是非线程安全的,在多线程环境下我们可能需要使用线程安全的 Map 容器,可选的有 HashTable 和 ConcurrentHashMap。HashTable 将所有可能出现线程安全问题的方法都使用 synchronized 来修饰,这种做法虽然简单粗暴,但是由于锁的粒度较大(所有访问 HashTable 的线程都在竞争同一把锁),导致它的并发性能较差。而 ConcurrentHashMap 则不同,在 JDK 7 中,它将锁细化为多把锁,每一把锁只用于锁定容器中的一部分数据,那么当多线程访问容器中不同数据段的数据时,线程之间是不存在锁竞争的,这就是我们常说的锁分段技术。但是到了 JDK 8,ConcurrentHashMap 又出现了很大的变化,最大的变化就是不再使用锁分段技术,转而使用 CAS 和 synchronized,这在文章中会具体介绍。

Read more »

我们可以把锁理解成门票,只有当线程拿到了门票才能进入临界区。我们可以用一个状态变量 state 表示锁,当 state 为 true 时就表示已经获取到了锁,为 false 时就表示锁已经被其他线程占用。那么当锁被占用时,应该怎么处理?基本上有两种思路,其中一种就是循环检测直到锁可用,也就是自旋锁;另一种就是让出 CPU 时间片,等待唤醒通知。这里主要讨论自旋的算法,为深入学习 AQS 做铺垫。

Read more »

在很多分布式系统中,常常需要对大量的数据和消息进行唯一标识。在分库分表的应用中,由于数据库从原先的单一节点切分到了多个节点上,因此数据库自身的主键生成机制就不能再使用了,因为我们无法保证某个分片上的数据库生成的主键在全局上是唯一的。这个时候一个分布式(全局唯一)的主键生成系统就很有必要了。

Read more »

在 JavaScript 中,函数是第一等公民,它的地位与其他值(数值、布尔值、字符串等)相同。同时函数也是对象,它可以保存在变量、对象和数组中,可以作为参数传递,也可以作为结果返回,同时它还可以拥有自己的方法。

Read more »
0%