decaywood's Blog


只要有足够的意义和理由,突破已有的原则就可以认为是一种创新
  • 博客已累计录入 48 篇文章
  • 导航升级,全新的浏览体验
  • 极大的优化了动画特效性能
  • github错误校正可以使用了
  • 夜间模式已经可以使用,点击右上角切换
  • 点击侧边栏标签分类阅读文章
  • 博客兼容移动设备,可使用手机和平板阅读

JVM中的锁优化

Lock optimization of JVM

自旋锁 互斥同步对性能最大的影响是阻塞的实现,挂起线程和恢复线程的操作都需要转入内核态中完成,这些操作给系统的并发性能带来了很大的压力。而在很多应用上,共享数据的锁定状态只会持续很短的一段时间。若实体机上有多个处理器,能让两个以上的线程同时并行执行,我们就可以让后面请求锁的那个线程原地自旋(不放弃CPU时间),看看持有锁的线程是否很快就会释放锁。为了让线程等待,我们只须让线程执行一个忙循环...

关于 JVM 的重排序

About Reordering of JVM

重排序通常是编译器或运行时环境为了优化程序性能而采取的对指令进行重新排序执行的一种手段。重排序分为两类:编译期重排序和运行期重排序,分别对应编译时和运行时环境。 在并发程序中,程序员会特别关注不同进程或线程之间的数据同步,特别是多个线程同时修改同一变量时,必须采取可靠的同步或其它措施保障数据被正确地修改,这里的一条重要原则是:不要假设指令执行的顺序,你无法预知不同线程之间的指令会以何种顺序...

Java在代码层面的一些优化技巧

some skills of optimization for Java

程序的结构是否标准,代码的细节是否值得推敲,系统的可维护性是否良好。这些方面对于一个产品在后期投入人力成本有直接关系。所以,习惯良好的程序员在程序后期维护上面比码农程序员有着更多的选择余地,不会因为改了某个需求而将宝贵的时间大把浪费在修复bug或者打补丁上。所以,优秀的coder都应该尽可能的让自己的代码更加敏捷、极致。此文将介绍一些Java在代码层面的一些优化技巧,也是对自己编码时遇到的一...

JavaScript的 Event Loop 模型

The JavaScript Event Loop

前言 现如今,作为浏览器脚本语言的JavaScript几乎无处不在。作为软件开发人员,接触JavaScript语言也是不可避免的。由于项目需要,本人接触这门语言也有将近一年了。写这篇文章的原因也是对JavaScript语言本身的编程模型做一个总结,借以巩固自己对JavaScript的理解,并希望举一反三,通过了解其独特的编程模型,进一步消化吸收,提高自己知识的深度与广度。本文将介绍一些有关...

关于JavaScript的闭包

About closure of JavaScript

闭包是ECMAScript(JavaScript)最强大的特性之一,但用好闭包的前提是必须理解闭包。闭包的创建相对容易,人们甚至会在不经意间创建闭包,但这些无意创建的闭包却存在潜在的危害,尤其是在比较常见的浏览器环境下。如果想要扬长避短地使用闭包这一特性,则必须了解它们的工作机制。而闭包工作机制的实现很大程度上有赖于标识符(或者说对象属性)解析过程中作用域的角色。 变量的作用域 要理解闭...

一些与JVM类加载器有关的实验

Some laboratory experiments of JVM ClassLoader

目录 Java虚拟机类加载器结构 JVM内置的三个基础类加载器 我们首先看一下JVM预定义的三种类型类加载器,当一个JVM启动的时候,Java缺省开始使用如下三种类型类装入器: 启动类加载器(BootstrapClassLoader):启动类加载器是用本地代码实现的类加载器,它负责将$JAVA_HOME/lib下面的核心类库或-Xbootclasspath选项指定的jar包加载...

Java类加载机制分析

The mechanism of Java class loading

类加载过程 类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括7个阶段: 加载(Loading) 验证(Verification) 准备(Preparation) 解析(Resolution) 初始化(Initialization) 使用(Using) 卸载(Unloading) 其中准备、验证、解析3个部分统称为连接(Linking)...

ThreadLocal原理分析

ThreadLocal Reveal

ThreadLocal的理解 ThreadLocal,也称线程本地变量。顾名思义,ThreadLocal为变量在每个线程中都创建了一个副本,那么每个线程可以访问自己内部的副本变量。其意义在于高并发场景时变量为各个线程所读时互不影响,有效地避免了线程安全问题,也避免了同步造成的性能开销。不过使用这种技巧的同时,也会伴随着一些不可避免的缺陷:由于在每个线程中都创建了副本,所以要考虑它对资源的消...

Copy-On-Write 容器

Copy-On-Write Collection

什么是CopyOnWrite容器 Copy-On-Write简称COW,是一种用于程序设计中的优化策略。其基本思路是,当某个线程想要修改某个内容的时候,容器会把数据拷贝一份进行修改。这是一种延时懒惰策略。从JDK1.5开始Java并发包里提供了两个使用CopyOnWrite机制实现的并发容器,它们是CopyOnWriteArrayList和CopyOnWriteArraySet。CopyO...

Git 的 cherry-pick 功能

Cherry-pick of Git

简而言之,cherry-pick就是从不同的分支中捡出一个单独的commit,并把它和你当前的分支合并。如果你以并行方式在处理两个或以上分支,你可能会发现一个在全部分支中都有的bug。如果你在一个分支中解决了它,你可以使用cherry-pick命令把它commit到其它分支上去,而不会弄乱其他的文件或commit。 以我目前做的项目为例,现在有4个开发者维护着四个分支,以自己的用户名命名,...

Java并发中的Lock

Lock in Java Concurrent

从Java 5之后,在java.util.concurrent.locks包下提供了另外一种方式来实现同步访问,那就是Lock。 也许有朋友会问,既然都可以通过synchronized来实现同步访问了,那么为什么还需要提供Lock?这个问题将在下面进行阐述。本文先从synchronized的缺陷讲起,然后再讲述java.util.concurrent.locks包下常用的有哪些类和接口,最...

一个成功的Git分支模型

A Successful Git Branch Model

原文 在这篇文章中介绍的开发模型在大约一年前已经在我的私有项目和工作引入的,而且已经被证明是非常成功的。我想写一些关于这个模型的东西已经好一段时间了,但是一直苦于没有时间,不过现在可以了。我不想探讨任何项目细节,只讨论分支策略和发布管理。 这篇文章围绕着Git做为我们所有的源代码版本控制工具而展开的。 为什么是Git 作为一个开发者,相比其他工具,当前我更喜欢Git。Git的确改...

烫手山芋以及如何应对甲方频繁的变更需求

Legacy Project & The key to face the frequently requirements change

空管局那边差不多没什么事了,然而这学期刚开始,假期综合症还没缓下来,实验室师兄的遗留项目被由我负责的小队接下来了,说实话真心有点郁闷。 这个项目以前跟师兄交流过,无非是前端定时从后台定时get一些地图数据展示罢了,没什么难的,技术栈相当简单:前端使用d3配合百度ECharts进行展示,后台使用Tornado进行异步处理请求,数据库暂定MySQL。唯有一点让我左右为难,甲方无止境的需求变更。...

Java IO编程模型概览

Summary of Java IO-Programming Model

传统的 BIO 编程 网络编程的基本模型为C/S模型,也就是两个进程之间进行相互通信,其中服务端提供位置信息(绑定的IP地址和监听端口),客户端通过连接操作向服务端监听的地址发起连接请求,通过三次握手建立连接,如果连接建立成功,双方就可以通过网络套接字(Socket)进行通信。 在基于传统同步阻塞模型开发中,ServerSocket负责绑定IP地址,启动监听端口:Socket负责发起连接...

Linux下epoll对于select所做的改进总结

The Milestone from Select to Epoll

本文作为博客内Linux下的五种IO模型一文的补充 目前支持IO多路复用的系统调用有select、pselect、poll、epoll,在Linux网络编程过程中,很长一段时间都使用select做轮询和网络事件通知,然而select的一些固有缺陷导致了它的应用受到了很大的限制,使得linux不得不在新的内核中寻找出替代方案,最终选择了epoll。epoll与select原理类似,为了克服s...

关于原子操作

About Atomic Operation

前言 原子(atom)本意是“不能被进一步分割的最小粒子”,而原子操作(atomic operation)意为”不可被中断的一个或一系列操作” 。在多处理器上实现原子操作就变得有点复杂。本文让我们一起来聊一聊在Inter处理器和Java里是如何实现原子操作的。 术语定义 术语名称 英文 解释 ...

Git 备忘录

More about Java volatile

基本设置 配置资料: # 配置用户名 git config --global user.name "Your Real Name" # 配置邮箱地址 git config --global user.email you@email.address 生成 SSH 密钥: ssh-keygen -C 'your@email.address' -t rsa 初始化一个项目: #...

Java volatile 关键字原理分析「转」

More about Java volatile

前言 在多线程并发编程中synchronized和Volatile都扮演着重要的角色,Volatile是轻量级的synchronized,它在多处理器开发中保证了共享变量的“可见性”。可见性的意思是当一个线程修改一个共享变量时,另外一个线程能读到这个修改的值。它在某些情况下比synchronized的开销更小,本文将深入分析在硬件层面上Inter处理器是如何实现Volatile的,通过深入...

JVM结构概览与运行机制

The Structure & Operating Mechanism of JVM

本文旨在给所有希望了解JVM(Java Virtual Machine)的同学一个概念性的入门,主要介绍了JVM的组成部分以及它们内部工作的机制和原理。当然本文只是一个简单的入门,不会涉及过多繁杂的参数和配置,感兴趣的同学可以做更深入的研究,在研究JVM的过程中会发现,其实JVM本身就是一个计算机体系结构,很多原理和我们平时的硬件、微机原理、操作系统都有十分相似的地方,所以学习JVM本身也是...

面向GC的Java编程「转」

GC Oriented Programming

Java程序员在编码过程中通常不需要考虑内存问题,JVM经过高度优化的GC机制大部分情况下都能够很好地处理堆(Heap)的清理问题。以至于许多Java程序员认为,我只需要关心何时创建对象,而回收对象,就交给GC来做吧!甚至有人说,如果在编程过程中频繁考虑内存问题,是一种退化,这些事情应该交给编译器,交给虚拟机来解决。 这话其实也没有太大问题,的确,大部分场景下关心内存、GC的问题,显得有点...