ThreadLocal一个使用——SimpleDateFormat

背景

之前写过一篇文章:《ThreadLocal、HandlerThread、Lopper区别》,其中简单提及了ThreadLocal的解释。本篇文章主要结合具体应用场景——SimpleDateFormat,和大家来一起学习ThreadLocal的原理,并对ThreadLocal进行一个详细的介绍。

下面是本文的参考资料:

java学习记录–ThreadLocal使用案例——SimpleDateFormat:
http://blog.csdn.net/u012706811/article/details/53231598

SimpleDateFormat的线程安全问题与解决方案:
http://www.cnblogs.com/zemliu/archive/2013/08/29/3290585.html

前言

Thread这个类有一个变量:ThreadLocal.ThreadLocalMap threadLocals。

这是一个map的数据结构,里面的元素的key就是ThreadLocal,value就是我们自定义的一些目标类。

我们可以在自己的多线程类中定义好几个ThreadLocal,然后每一个ThreadLocal put一个特定的目标类,然后以后可以用ThreadLocal get到目标类(ThreadLocal用自己作为Thread里map的key),因为每个Thread有自己独自的map,所以这样可以实现每个线程有自己的LocalThread,并且一个Thread里可以有多个LocalThread。

ThreadLocal为变量在每个线程中都创建了一个副本,所以每个线程可以访问自己内部的副本变量,不同线程之间不会互相干扰。

本篇文章结合具体应用场景,来分析ThreadLocal为什么可以实现不同线程之间不会互相干扰。

Read More

Share Comments

Hexo 模板学习——Hexo 结构

起步

Hexo会读取根目录下的_config.yml里面的theme属性, 从而采用对应的主题。而主题都是放在themes/目录下面的,然后你会发现他里面有个landscape的目录,这个就是默认主题啦。

接着,我们查看themes/landscape/目录,以及根据文档docs-themes,我们很容易得出:一个主题其实由4部分组成。

  • _config.yml: 主题的配置文件
  • source/: 放我们的CSS文件以及图片
  • layout/: 模板文件
  • scripts: 放JavaScript文件,他们会自动加载

根据文档docs-templates,下面表格中每个页面都有一个可用的模板,可以没有这些模板,但至少要有一个index模板。

Read More

Share Comments

Hexo 模板学习——EJS介绍

什么是EJS?

EJS是JavaScript模板库,用来从JSON数据中生成HTML字符串

EJS的语法和功能:

1、缓存功能,能够缓存已经解析好的html模版

2、<% code %>用于执行其中javascript代码。

<% alert('hello world') %>

3、<%= code =%>会对code进行html转义;

Read More

Share Comments

nodejs入门

本文是我自己的学习笔记,整理自《Node入门》

Node入门

作者: Manuel Kiessling
翻译: goddyzhao & GrayZhang & MondayChen

本书致力于教会你如何用Node.js来开发应用,过程中会传授你所有所需的“高级”JavaScript知识。本书绝不是一本“Hello World”的教程。

服务端JavaScript

JavaScript最早是运行在浏览器中,然而浏览器只是提供了一个上下文,它定义了使用JavaScript可以做什么,但并没有“说”太多关于JavaScript语言本身可以做什么。事实上,JavaScript是一门“完整”的语言: 它可以使用在不同的上下文中,其能力与其他同类语言相比有过之而无不及。

Node.js事实上就是另外一种上下文,它允许在后端(脱离浏览器环境)运行JavaScript代码。

Read More

Share Comments

JAVA泛型通配符T,E,K,V区别,T以及Class<T>,Class<?>的区别

文章转载自《JAVA泛型通配符T,E,K,V区别,T以及Class,Class<?>的区别》

1. 先解释下泛型概念

泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。Java语言引入泛型的好处是安全简单。

在Java SE 1.5之前,没有泛型的情况的下,通过对类型Object的引用来实现参数的“任意化”,“任意化”带来的缺点是要做显式的强制类型转换,而这种转换是要求开发者对实际参数类型可以预知的情况下进行的。对于强制类型转换错误的情况,编译器可能不提示错误,在运行的时候才出现异常,这是一个安全隐患。

Read More

Share Comments

Hexo 出错情况收集

Error: Cannot find module ‘./build/Release/DTraceProviderBindings’

我在更新hexo,准备安装别的module时,不小心按到了 ctrl+c,结果发现使用hexo命令会报如下错误:

{ [Error: Cannot find module './build/Release/DTraceProviderBindings'] code: 'MODULE_NOT_FOUND' }    
{ [Error: Cannot find module './build/default/DTraceProviderBindings'] code: 'MODULE_NOT_FOUND' }
{ [Error: Cannot find module './build/Debug/DTraceProviderBindings'] code: 'MODULE_NOT_FOUND' }

Read More

Share Comments

gradle 学习2——生成指定文件名的apk

上一篇Gradle学习了解了Gradle的基本结构和依赖关系,这篇文章介绍下怎么在Android上使用Gradle生成指定包名的APK

需求场景

在我们Android开发基本进入测试阶段后,会根据后台的不同环境,打包出对应不同环境(如SIT、UAT、PRD等)的APK安装包。

每次去手动修改Java类改变后台环境太麻烦还容易忘记修改。打包成功后,还需要手动将默认的包名app-release.apk改成我们需要的包名,也是非常麻烦,有没有直接指定环境,生成指定文件名的安装包呢?

方法是有的,就是利用gradle的分渠道打包特性,下面上代码分别解释。

主要在这两个个地方修改:

  • buildType(构建类型)
  • productFlavors (不同定制的产品)

Read More

Share Comments

gradle 学习

Gradle是一种依赖管理工具,基于Groovy语言,面向Java应用为主,它抛弃了基于XML的各种繁琐配置,取而代之的是一种基于Groovy的内部领域特定(DSL)语言。它提供灵活的通用构建工具,就像ant。同时完美兼容Maven或Ivy仓库

Gradle的基本组成

项目(Project) 和 任务(tasks),Gradle 里的任何东西都是基于这两个基础概念。

Read More

Share Comments