`
文章列表
引言   随着公司海外业务发展,对系统的国际化改造已经势在必行。为了不影响国内业务,我们的做法是基于现有系统,采用国际化的思路搭建一套新的系统。我有幸被指定负责这次国际化基础架构设计和开发工作。   本 ...
  目录 Random实例是线程安全 Random类的构造方法 Random的nextInt方法 Random的其他随机方法 Math.random()和ThreadLocalRandom     Random实例是线程安全   Random实例是线程安全的,通过源码可以发现其通过CAS指令完成线程安全。首先我们来看下他的主要成员变量AtomicLong种子: private final AtomicLong seed; AtomicLong 原子操作的Long型,是final修饰的,结合源码可以看出三点内容: 1、seed是final修饰的,也就是说必须要在ra ...
一条慢查询日志   mysql的索引是一把双刃剑,如果使用得当,会给系统带来极大的性能提升;相反的如果使用不当,则可能会带来灾难性的后果。最可怕的是前期很难发现,随着数据量的增加以及业务高峰期的临近,问题才会 ...
统一自定义序列化   上一篇《java序列化用法以及理论(三)》讲解了两种自定义序列化方式: 1、自定义writeObject和readObject方法 2、实现Externalizable接口,并重写writeExternal和readExternal方法   其实对于自定义序列化还有一种方式实现自定义,就是创建ObjectOutputStream 和ObjectInputStream的子类,并重写相应的方法即可: 创建ObjectOutputStream的子类,重写writeObjectOverride方法,实现自己的序列化逻辑。 创建ObjectInputStream ...
基本概念   Java的jdk中自带了一个序列化框架:可以将对象编码成字节流,并可以从字节流编码中重新构建出新对象。这里的“将一个对象编码成一个字节流”,称之为“对象序列化”;相反的” 从字节流编码中重新构建出新 ...
  Java 反序列化   Java的反序列化,是序列化的逆向过程。基础类型的序列化比较简单,这里主要讲解对象的反序列化,从文件或网络中把字节序列读取出来,并解析字节序列中的对象类描述信息、以及对象成员的值信息,并生成一个新对象的过程。   先看下对象反序列化的参数:字节序列(字节数组) 这里的字节序列一般是通过上一篇《java序列化的内部实现(一)》中序列化过程产生的; 当然如果有必要的话也可以手工拼装(这种场景比较少); 更多是对序列化参数的字节序列进行篡改,操控反序列端的对象生成(如:被攻击者攻击)。   一个简单的例子   Java的反序列化时通过实例化Obje ...
前言   上一遍关于HashSet的最后部分提到自定义序列化重写序列化的readObect和writeObject方法,个人感觉结束比较仓促。由于序列化在java中有着举重轻重的地位,尤其是在RPC框架中,对象的传输都是通过序列化完成。所以萌生了对java的序列化做一次系统的总结。   初步设想关于java序列化的总结分成三部分:java序列化的内部实现、java反序列化的内部实现、java序列化用法以及理论。   本篇分享为第一部分“java序列化的内部实现”,主要是通过一个序列化实例 剖析java序列化的内部实现过程。   Java对象序列化  
基于HashMap实现   HashSet内部实现是基于HashMap的,这是阅读和理解HashSet源码的关键,只要理解了HashMap的实现原理,再来看HashSet的源码就简单了。对于HashMap源码的阅读可以看之前的一篇文章。   首先看两个重要的成员变量: private transient HashMap<E,Object> map; private static final Object PRESENT = new Object();//HashMap的value存放的都是这个对象   HashSet内部的主要成员变量是一个HashMap,使用这个 ...
不可变类   在日常java开发中,String是用得最多的类之一。对于jdk的String类的设计方式值得我们去思考和学习。   String类是一个不可变类,java平台的类库中包含的不可变类,如:String、基本类型的包装类(Integer等)、BigInteg ...
  静态常量类   在java开发中,我们会经常用到一些静态常量用于状态判断等操作。为了能够在多个地方复用这些常量,通常每个模块都会加一个常量类,举个简单的列子: import com.sky.OrderMouleConsstants; /** * Created by gantianxing on 2017/4/21. */ public class Test { public void main() { int orderState = orderService.getOrderState(id); if(OrderM ...
目录   一、HashMap的rehash机制 二、hashcode()和equals()方法 三、与Hashtable比较   一、HashMap的rehash机制   前一篇说到在大量数据需要放入到ArrayList时,先确定总体容量大小,尽量使用确定容量的构造方法进行实例化,防止因为自动扩容导致的数组复制。   相信大家也猜到了HashMap,也有类似问题。HashMap
从原型模式说起   最近复习了一下23种设计模式,其中有一种模式叫“原型模式”,我更想称之为“克隆模式”。看到一遍讲的比较清楚的文章: http://www.cnblogs.com/java-my-life/archive/2012/04/11/2439387.html。   文中提到克隆,分为浅克隆和深克隆。看完之后我个人的理解是这样: 浅克隆:只负责克隆不可变类型的数据(比如基本数据类型、String类型),而不复制它所引用的对象,换言之,所有的对其他对象的引用都仍然指向原来的对象。具体做法是实现Cloneable接口,覆盖Object的clone()方法。   深克隆: ...
引子   最近在从事一些基于大数据做 “应用级产品”的架构设计和开发工作,比如 实时流量监控、实时热力图、注意力热图等。发现一些基础类的正确使用,对性能提升还是挺大的。记录下来,时刻提醒自己一定要开发中的注意细节。   “万丈高楼平地起”,在软件开发中如果不注重细节,会带来很大的性能问题,尤其是在大数据相关产品的开发中。本系列中会结合开发中遇到的实际情况,结合源码进行分析。首先来看看我们用得很多的ArrayList。   一个典型的场景:批量向hbase写入数据(数据量大的情况下尽量避免一条一条的插入)。一般的写法为: //在大数据场景下,该方法会被循环调用   publi ...
背景   最近在搞一些大数据智能推荐方面的开发工作,为了保证推荐的实时性,没隔10分钟会启动几个worker遍历所有数据 进行检查。   程序在预发环境运行一段时间后,偶尔会出现堆内存使用率超过80%的情况(公司监控系统默认堆内存使用率超过80%后,就会报警)。   重启后 一段时间内存使用情况是正常的,所以初步怀疑有存在内存泄露。   分析问题   1、按照内存泄露流程排查:ps -ef|grep java 找到对应java工程的进程号(也可以用top)
前言 上一篇《大数据学习之--hadoop2.7.3环境搭建》已经在一台笔记本上完成了模拟hadoop集群的搭建,这次准备在win7操作系统中采用idea开发工具 搭建hadoop MapReduce的开发环境。直接在idea中执行MapReduce程序,即可直连vmware中的hadoop集群进行模拟大数据运算。   准备工作 1、安装idea(或者eclips),jdk1.8,安装步骤这里不讲了。 2、下载hadoop2.7.3,解压到本地目录(我的D:\myself\hadoop-2.7.3)。 3、下载hadoop.ll和winutils.exe放到D:\myself\h ...
Global site tag (gtag.js) - Google Analytics