随笔分类 -  知识总结

摘要:一、背景 功能模块化是实现系统能力高可扩展性的常见思路。而模块化又可分为静态模块化和动态模块化两类: 1. 静态模块化:指在编译期可以通过引入新的模块扩展系统能力。比如:通过maven/gradle引入一个依赖(本质是一组jar文件)。 2. 动态模块化:指在JVM运行期可以通过引入新的模块扩展系统 阅读全文
posted @ 2018-05-31 22:52 敲代码的小阿狸 阅读(1677) 评论(0) 推荐(0)
摘要:一、背景 熟悉数据库隔离级别的人都知道,在RR(可重复读)隔离级别下,无论何时多次执行相同的SELECT快照读语句,得到的结果集都是完全一样的,即便两次SELECT语句执行期间,其他事务已经改变了该查询结果并已经提交。 对于这一机制的实现原理,网上常见的一种解释如下: 上述解释确实可以让读者简单快速 阅读全文
posted @ 2018-04-14 17:18 敲代码的小阿狸 阅读(5763) 评论(7) 推荐(3)
摘要:一、背景 熟悉MySQL数据库的朋友们都知道,查询数据常见模式有三种: 1. select ... :快照读,不加锁 2. select ... in share mode:当前读,加读锁 3. select ... for update:当前读,加写锁 从技术层面理解三种方式的应用场景其实并不困难 阅读全文
posted @ 2018-02-06 11:25 敲代码的小阿狸 阅读(6098) 评论(1) 推荐(2)
摘要:一、背景 提到Java中的并发编程,首先想到的便是使用synchronized代码块,保证代码块在并发环境下有序执行,从而避免冲突。如果涉及多线程间通信,可以再在synchronized代码块中使用wait和notify进行事件的通知。 不过使用synchronized+wait+notify进行多 阅读全文
posted @ 2017-11-15 10:53 敲代码的小阿狸 阅读(814) 评论(0) 推荐(1)
摘要:一、背景 容器是Java编程中使用频率很高的组件,但Java默认提供的基本容器(ArrayList,HashMap等)均不是线程安全的。当容器和多线程并发编程相遇时,程序员又该何去何从呢? 通常有两种选择: 1、使用synchronized关键字,将对容器的操作有序错开,确保同一时刻对同一个容器只存 阅读全文
posted @ 2017-11-08 15:44 敲代码的小阿狸 阅读(837) 评论(0) 推荐(1)
摘要:一、背景 要提升服务器的并发处理能力,通常有两大方向的思路。 1、系统架构层面。比如负载均衡、多级缓存、单元化部署等等。 2、单节点优化层面。比如修复代码级别的性能Bug、JVM参数调优、IO优化等等。 一般来说,系统架构的合理程度,决定了系统在整体性能上的伸缩性(高伸缩性,简而言之就是可以很任性, 阅读全文
posted @ 2017-10-29 18:50 敲代码的小阿狸 阅读(2148) 评论(0) 推荐(1)
摘要:一、String的不可变特性 熟悉Java的朋友都知道,Java中的String有一个很特别的特性,就是你会发现无论你调用String的什么方法,均无法修改this对象的状态。当确实需要修改String的值时,String方法的实现是构造一个新的String返回给你。如下: 这与C++ STL中的s 阅读全文
posted @ 2017-10-15 12:53 敲代码的小阿狸 阅读(1660) 评论(0) 推荐(1)
摘要:一、背景 我们知道,在Java编程过程中,如果打开了外部资源(文件、数据库连接、网络连接等),我们必须在这些外部资源使用完毕后,手动关闭它们。因为外部资源不由JVM管理,无法享用JVM的垃圾回收机制,如果我们不在编程时确保在正确的时机关闭外部资源,就会导致外部资源泄露,紧接着就会出现文件被异常占用, 阅读全文
posted @ 2017-10-08 09:46 敲代码的小阿狸 阅读(67070) 评论(10) 推荐(31)
摘要:一、背景 要搞懂Java中的协办与逆变,不得不从继承说起,如果没有继承,协变与逆变也天然不存在了。 我们知道,在Java的世界中,存在继承机制。比如MochaCoffee类是Coffee类的派生类,那么我们可以在任何时候使用MochaCoffee类的引用去替换Coffee类的引用(重写函数时,形参必 阅读全文
posted @ 2017-09-24 12:56 敲代码的小阿狸 阅读(2567) 评论(0) 推荐(2)
摘要:不同数据库的分页查询语句有着较大区别,其中MySQL数据的limit offset语法最为简单,而SQL Server数据库和Oracle数据库的分页就比较复杂了。 网上常见的SQL Server和Oracle数据库的分页语句都或多或少对表结构有要求,比如必须有递增的主键ID等。 当我们不能确定所连 阅读全文
posted @ 2017-09-06 20:00 敲代码的小阿狸 阅读(3869) 评论(1) 推荐(0)
摘要:一、背景 枚举经常被大家用来储存一组有限个数的候选常量。比如下面定义了一组常见数据库类型: 当围绕这一组常量出现功能上的扩展点时,很多人的做法是为新的功能编写一个新类,新类中依赖该枚举类型。 比如要在界面上显示常见数据库类型的官方名称,可以用如下类实现这一功能: 大量的if - else语句以及对其 阅读全文
posted @ 2017-09-05 19:42 敲代码的小阿狸 阅读(765) 评论(1) 推荐(1)
摘要:交叉连接:(不常用)返回两个表的笛卡尔乘积(也即全组合排列)中符合查询条件的数据行。 内连接返回连接表中符合连接条件和查询条件的数据行。 左外连接返回符合连接条件和查询条件(即:内连接)的数据行,且还返回左表中不符合连接条件但符合查询条件的数据行。 右外连接返回符合连接条件和查询条件(即:内连接)的 阅读全文
posted @ 2017-08-30 18:23 敲代码的小阿狸 阅读(1841) 评论(0) 推荐(0)
摘要:JSON有三类元素: 1、结构体(关键字:大括号)2、键值对(关键字:冒号)3、数组(关键字:中括号) 组织规则:结构体中放一个或者多个键值对。键只能是字符串。值可以是:字符串、数字、null、true、false、结构体或者数组。数组中存放一个或者多个值。 范例: 阅读全文
posted @ 2017-08-30 18:21 敲代码的小阿狸 阅读(6251) 评论(0) 推荐(0)
摘要:在C++中,指针的类型转换是经常发生的事情,比如将派生类指针转换为基类指针,将基类指针转换为派生类指针。指针的本质其实就是一个整数,用以记录进程虚拟内存空间中的地址编号,而指针的类型决定了编译器对其指向的内存空间的解释方式。 基于上面的理解,我们似乎可以得出一个结论,C++中对指针进行类型转换,不会 阅读全文
posted @ 2012-10-08 11:47 敲代码的小阿狸 阅读(3542) 评论(5) 推荐(2)
摘要:对于初学STL的人来说,map可能是最全能的伙伴,只需敲下三个字母,一个天然有序,方便扩展,高效检索的数据结构就这样轻轻松松的产生了,这得益于C++的模版技术。在享受标准模版库带给我们便利的同时,我们也需要简单理解一下其内部的实现的某些关键机制,否则的话,就很可能就会犯下面这个的错误。 上面的代码输 阅读全文
posted @ 2012-10-03 14:59 敲代码的小阿狸 阅读(1854) 评论(0) 推荐(1)
摘要:C++最新标准C++11中已将基于引用计数的智能指针share_prt收入囊中,智能指针的使用门槛越来越低,不需要使用boost库,我们也能轻松享受智能指针给我们带来的方便。 智能指针,正如它的名字一样,似乎是个近乎完美的聪明角色,程序员不用再纠结于new出来的内存在哪释放比较合适这种问题。比如当一 阅读全文
posted @ 2012-10-01 20:50 敲代码的小阿狸 阅读(7088) 评论(4) 推荐(5)