WenShu's Blog

River Flows In You.

Java并发中的不可变对象

在多线程编程中,不可变对象非常有用,因为不可变对象在多线程环境共享下没有状态不一致问题,线程访问不可变对象没有加锁解锁的开销。 不可变对象的状态自从创建后就不会被改变,因为不可变对象天生具备线程安全的特性。

在JDK中,String和Integer Long等基本类型的包装类是典型的不可变对象。

编写不可变对象准则

  • 不可变对象的状态自创建后不可更改,或者使用另一个不可变对象整体替换
  • 不可变对象的所有成员变量应该是final
  • 不可变对象不可继承,final Class 实现
  • 不可变对象的只设置getter方法,添加setter方法。getter返回成员变量对象引用时,返回该对象一个副本

Java内存模型之Happen-Before原则

Java内存模型是描述在并发环境中多线程之间是如何交互的。其中重要的一部分就是Happen-Before原则,具体如下:

程序顺序原则

在线程中,指令重排会保证线程内语句执行的语义上的一致性. 注意这里说的是语义上的一致性,而不是程序语句上的一致性。

int a = 0; //语句 1
int b = 1; //语句 2

上面的代码块从程序语句顺序上讲,语句1在语句2前面,两条语句颠倒顺序成为下面的样子:

int b = 1; //语句 2
int a = 0; //语句 1

Go和Java的异同

Rob said:“Go was designed to help write big programs, written and maintained by big teams.”

相同点

1 命令式编程语言

Go和Java都是属于命令式编程语言,与函数式编程语言相区别。我们熟知的著名的编程语言C/C++都是属于命令式编程语言的范畴,函数式编程语言Erlang非常具有代表性,历史也比较悠久。

2 静态类型

Go和Java都是静态类型语言,就是说变量或者方法的类型在编译时期就可以判断和检查。静态类型和动态类型语言相对于,可以在编译期就可以做类型检查的都是静态类型语言,而动态类型语言却需要等到运行时才可以做类型判断。C/C++,C#都是静态类型,动态类型语言我们也非常熟悉,JavaScript,Ruby和Python都是典型的动态语言。

静态类型语言主要优点在于在编译期可以做类型检查,可以在运行之前发现bug,便于调试。

Go 并发

Go并发是以协程(goroutine)为基础的,那么问题来了。 协程是什么?与线程有什么区别联系?Go为什么选择协程而不是线程?

协程是什么

在Go中,你可以使用go f() 发起一个协程。其中f()是Go中的func调用。所以个人认为Go中的协程是一个“函数调用”,是一个执行线。多个“函数调用”之间是并发的关系。

像黑客一样写blog:Ubuntu14.04+Octopress+Github Pages

之前在windows 10 上部署了一套Octopress环境,但是如果要发布博客,就只有在安装了Octopress环境才能发布blog.因为就有了这篇写在Ubuntu14.04系统中的文章。与在windows上安装有些不同,有些需要注意的问题,在这篇文章会指出这些问题,并给出解决办法。希望此篇文章能够为有意在Ubuntu14.04上安装Octopress环境的童鞋提供一个参考操作步骤。如有不准确的地方,还请批评指正。

  • 基本工具介绍
  • 安装依赖
  • 安装Octopress
  • 发布Github Pages
  • 绑定私有域名
  • 发布第一篇Blog
  • 换台电脑继续写博客
  • 参考链接