Floating Cat

从JVM内存模型到线程安全
存储器层次结构对于开发者来说,存储器的层次结构应该是非常熟悉的,大体如下: 其中寄存器,L1,L2,L3都被封装在CPU芯片中,作为应用开发者而言我们很少去注意和使用它.之所以引入L1,L2,L3高速寄存器,其根本是为了解决访问运算器和内存速度不匹配.但缓存的引入也带来两个问题: 缓存命中率:缓存的数据都是主存中数据的备份,如果指令所需要的数据恰好在缓存中,我们就说缓存命中,反之,需要从主存中获取.一个好的缓存策略应该尽可能的提高命中率,如何提高却是一件非常困难的事情. 缓存一致性问题:我们知道缓存是主存数据的备份,但每个核心都有自己的缓存,当缓存中的数据和内存中的数据不一致时,应该以...
乱序执行与内存屏障
今天准备来聊聊乱序执行技术和内存屏障.为了能让大多数人理解,这里省略了很多不影响理解的旁枝末节,但由于我个人水平有限,如果不妥之处,希望各位指正. 顺执行技术在开始说乱序执行之前,得先把按序执行说一遍.在早期处理器中,处理器执行指令的顺序就是按照我们编写汇编代码的顺序执行的,换句话说此时处理器指令执行顺序和我们代码顺序一致,我们称之为按序执行(In Order Execution).我们以烧水泡茶为例来说明按序执行的过程(熟悉的同学会想起华罗庚的统筹学): 洗水壶 烧开水 洗茶壶 洗茶杯 拿茶叶 泡茶 我们假设每一步代表一条指令的执行,此时从指令1到指令6执行的过程就是我们所说的按序...
一个程序员的日常书单(2018)
今日元宵节,祝各位节日快乐.本想谈谈读书这个话题,想来想起觉得无从下手,就此作罢.毕业这几年,一直不敢放松,在现代这个互联网时代更加认同萧抡谓的”一日不读书,胸臆无佳想;一月不读书,耳目失清爽”.如果非要给自己找个读书的理由的话,这句诗就是最好的理由:”胸藏文墨虚若骨,腹有诗书气自华”. 与书结缘应该要感谢我的父亲和母亲.小时候,母亲嫌我捣蛋就有意的培养我读书.刚上小学时,父亲便从他战友哪里弄来几千本书,小学,初中,高中都是在期间度过.后来上大学,母亲担心我读书读傻了就全当废纸给卖了.现在母亲甚是后悔,毕竟里边有不少孤本.恰好近几日有朋友问我平时的都看什么书,便有将书单列出的想法,在原来...
来自Unix/Linux的编程启示录
在整个探究过程中,那些经典的著作再次让我获益匪浅:C和指针,C专家编程,深入理解计算机系统(原书第3版),Linux/Unix设计思想,Linux Shell脚本攻略.前两本书购于13年,断断续续的读了许久,这一次重读令人豁然开朗,其中许多不解之处在深入理解计算机系统一书得到答案,而后两本则是年前有幸读到.其中Linux/Unix设计思想不谈技术细节,却揭示了Linux/Unix隐含的指导思想,最后一本则是从Shell出发,以实践的角度教你如何利用Shell(Bash)在Linux/Unix平台上构建有效的解决方案,实乃入门进阶必备啊. 从女娲造人说起俗说天地开辟,未有人民,女娲抟黄土作...
年轻人谈独处和自律
独处与自律独处所谓独处是自己与自己相处的过程,独处不是孤僻.它是一个自己妥协,堕落,进而思考求真,最终接受喜欢自己的过程.它并非我们传统认知中的与世隔绝,更偏重于内心与周围世界的相互独立,这种感觉就像是你看电影,但电影的主角又是你. 独处可能是被动的,也可能是主动的.像我喜欢独自看书,学习,生活,很少主动与外界沟通,这就是主动独处.而同样作为北漂一族,下班之后,人生地不熟并没有太多的交际,因此而成的生活状态就是被动独处. 主动也好,被动也好,独处都是避不开的.在15年年底以及16年年底,我有两次长时间的独处,这两个阶段的独处不仅仅有与世隔绝的状态,更是内心觉悟和自我拯救的过程. 15年底...
玩转注解之进阶篇
编译时注解处理器什么是Android-apt我们知道APT是集成在javac当中的工具,这个Android-apt又是什么鬼呢? 对于从事Android开发的同学来说,ButterKnife这个开源工具可是非常熟悉.在使用该工具之前,你需要进行配置:12compile 'com.jakewharton:butterknife:8.4.0'apt 'com.jakewharton:butterknife-compiler:8.4.0' 这里的有什么用?我们在上一节中没有配置apt插件照样可以用,这是怎么一回事?Anroid-apt是用在Android Studio中处理注解处理的插件,它有...
玩转注解之基础篇
注解基础什么是元数据(metadata)元数据由metadata译来,所谓的元数据就是“关于数据的数据”,更通俗的说就是描述数据的数据,对数据及信息资源的描述性信息.比如说一个文本文件,有创建时间,创建人,文件大小等数据,这都可以理解为是元数据. 在java中,元数据以标签的形式存在java代码中,它的存在并不影响程序代码的编译和执行,通常它被用来生成其它的文件或运行时知道被运行代码的描述信息。java当中的javadoc和注解都属于元数据. 什么是注解(Annotation)?注解是从java 5.0开始加入,可以用于标注包,类,方法,变量等.比如我们常见的@Override,再或者A...
JNI开发之RegisterNatives
JNI开发流程相对比较固定,一般需要经过以下几步: 定义Native方法 生成.h头文件 编写C/C++文件 生成本地链接库 这里简单的写一个例子来演示上述流程. JNI开发流程定义Native方法为了说明流程,我们直接在根目录中创建Hello.java: 123456789public class Hello { public native void say(); public static void main(String[] args) { System.loadLibrary("hi"); Hello hello =...
Android杂谈:从模块化到组件化
模块化和组件化以下高能,请做好心理准备,看不懂请发邮件来交流.本文不推荐新手阅读,如果你刚接触Android开发不久,请立刻放弃阅读本文 模块化组件化不是个新概念,其在各行各业都一直备受重视.至于组件化什么时候在软件工程领域提出已经无从考究了,不过呢可以确认的是组件化最早应用于服务端开发,后来在该思想的指导下,前端开发和移动端开发也产生各自的开发方式. 在了解组件化之前,先来回顾下模块化的定义 Modular programming is a software design technique that emphasizes separating the functionality o...
Android SDK设计与开发(一)
概念简介什么是SDKSDK是Software Development Kit的缩写,译为”软件开发工具包”,通常是为辅助开发某类软件而编写的特定软件包,框架集合等,SDK一般包含相关文档,范例和工具. SDK可以分为系统SDK和应用SDK.所谓的系统SDK是为特定的软件包,软件框架,硬件平台,操作系统等简历应用时所使用的开发工具集合.而应用SDK则是基于系统SDK开发的独立于具体业务而具有特定功能的集合.比如在进行Android 应用开发时,我们使用Google提供的系统SDK(Android SDK),而我们经常使用的友盟SDK,极光SDK则是基于系统SDK开发的. 什么是Librar...