主页

自制代码生成器中的一些问题与思考

1. 引言 去年7月开始参加工作,刚开始被先后分配了两个制作基础页面的任务,也就是常规的增删改查,包括前端页面的 vue 文件以及后端实体类和各逻辑层的接口与实现类,总共需要创建 9 个文件,1个 vue、7个 java,1个 xml。 虽然可以使用 MybatisGenerator 根据数据库表自动生成实体类和 Mapper 层文件,但再往上的逻辑层就需要手动编写。Ctrl+C,Ctrl+V,再根据具体的实体类名称去修改,前前后后花了1个小时把一个基础页面调通。觉得实在太麻烦了,所以产生了写个代码生成器的念头,一键生成9个文件,从而告别复制粘贴。效果如下所示: 2. 技术点 根据代码模板生成,使用了常用的 FreeMarker 作为模板引擎。 为了简化使用操作,...

阅读更多

this与Thread.currentThread()的区别

引言 首先来看下下面这段代码。这是一段简单的中断线程的示例代码。 public class Test { static class Runner extends Thread { @Override public void run() { while (true) { if (Thread.currentThread().isInterrupted()) { System.out.println("Interruted!"); break; } } ...

阅读更多

MapReduce论文阅读记录

本文为阅读MapReduce论文的记录,内容主要是论文的第三部分——实现。方便本人今后查看。 1. 运行概述 下图展示了 MapReduce 过程的整体情况 当用户程序执行 MapReduce 时,会依次发生以下动作(对应图中的标号): 用户程序中的 MapReduce 库将输入文件分成 M 个分片,每片有16M-64M(由用户决定),MapReduce 库还会将程序拷贝到集群机器上。 集群中有一个 master,多个 worker。在拷贝程序过程中,其中 master 获得的程序是特殊的。master 将分配工作给 worker。现在有 M 个 map 任务和 R 个 reduce 任务需要被分配。master 会选择空闲的 worke...

阅读更多

谈Java中的CAS

前言 CAS(compare and swap, 比较并交换),是原子操作的一种,可用于在多线程编程中实现不被打断的数据交换操作,从而避免多线程同时改写某一数据时由于执行顺序不确定性以及中断的不可预知性产生的数据不一致问题。 简单来说,CAS可以保证多线程对数据写操作时数据的一致性。 CAS的思想:三个参数,一个当前内存值V、旧的预期值A、即将更新的值B,当且仅当预期值A和内存值V相同时,将内存值修改为B并返回true,否则什么都不做,并返回false。 数据不一致问题 一个n++的问题 public class Case { public volatile int n; public void add() { n++; } } 通过jav...

阅读更多

谈Python2、3中的str、unicode

前言 本文首先对Unicode与UTF-8的区别做一个解释,如果已了解,可跳过该部分。然后会分别对python2,3中的str、unicode进行讲解。有问题的地方,欢迎交流。 Unicode与UTF-8 Unicode 是「字符集」 UTF-8 是「编码规则」 字符集:为每一个「字符」分配一个唯一的 ID(学名为码位 / 码点 / Code Point) 编码规则:将「码位」转换为字节序列的规则(编码/解码 可以理解为 加密/解密 的过程) 广义的 Unicode 是一个标准,定义了一个字符集以及一系列的编码规则,即 Unicode 字符集和 UTF-8、UTF-16、UTF-32 等等编码…… Unicode 字符集为每一个字符分配一个...

阅读更多

HashMap之tableSizeFor

看HashMap的源码时,发现了里面好多很不错的算法。 tableSizeFor的功能(不考虑大于最大容量的情况)是返回大于输入参数且最近的2的整数次幂的数。比如10,则返回16。 该算法源码如下: static final int tableSizeFor(int cap) { int n = cap - 1; n |= n >>> 1; n |= n >>> 2; n |= n >>> 4; n |= n >>> 8; n |= n >>> 16; return (n < 0) ? 1 : (n >= MAXIMUM_CAPA...

阅读更多

HashMap与HashTable的源码比较

一、前言 一直都知道HashMap是常考的,所以今天把HashMap的源码看了一遍,然后又想起了HashTable,便想做一个比较。 HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Serializable HashMap继承于AbstractMap,Hashtable继承于Dictionary。 public class Hashtable<K,V> extends Dictionary<K,V> implements Map<K,V>, Cloneable, java.io.Serial...

阅读更多

Java-动态代理

引言 最近在看AOP代码,其中利用到了Java动态代理机制来实现AOP织入。所以好好地把Java动态代理学习了一遍。其中重点感谢《Java动态代理机制分析及扩展》这篇博文。受益匪浅,比《Thinking in Java》讲的还要详细。本文在原文的基础上增加了些其他参考资料的内容和自己的测试Demo及理解。 代理模式 首先,先来理解下什么是代理模式。 代理模式:给某一个对象提供一个代理,并由代理对象控制对原对象的引用。 代理模式包含如下角色: Subject:抽象主题角色 Proxy:代理主题角色 RealSubject:真实主题角色 Client将不直接调用RealSubject。而是通过Proxy作为中间人。Proxy可在调用RealSubject的...

阅读更多