并发原本就是个有意思的问题,尤为是如今又流行这么一句话:“高帅富加机器,穷矮搓搞优化”。从这句话能够看到,不管是高帅富仍是穷矮搓都须要深刻理解并发编程,高帅富加多了机器,须要协调多台机器或者多个CPU对共享资源的访问,所以须要了解并发,穷矮搓搞优化须要编写各类多线程的代码来压榨CPU的计算资源,让它在同一时刻作更多的事情,这个更须要了解并发。html
在我前一篇关于并发的文章http://my.oschina.net/chihz/blog/54731中提到过管程,管程的特点是在编程语言中对并发的细节进行封装,使程序员能够直接在语言中就获得并发的支持,而没必要本身去处理一些像是控制信号量之类容易出错且繁琐的细节问题。一些语言是经过在编译时解开语法糖的方式去实现管程,但Java在编译后生成的字节码层面上对并发仍然是一层封装,好比syncrhonized块在编译以后只是对应了两条指令:monitorenter和monitorexit。更多的并发细节是在JVM运行时去处理的,而不是编译。这篇文章主要是针对JVM处理并发的一些细节的探讨。java
1
|
boolean open= true;
|
1
2
3
4
|
//线程A
resource.close();
open = false;
|
1
2
3
4
5
|
//线程B
while(open) {
doSomethingWithResource(resource);
}
|
1
2
|
private int a;
private int b;
|
1
2
|
a = 1;
b = 2;
|
1
2
|
b = 2;
a = 1;
|
1
2
|
context = loadContext();
inited = true;
|
1
2
3
4
|
while(!inited ){
sleep
}
doSomethingwithconfig(context);
|
1
2
|
inited = true;
context = loadContext();
|
这篇文章简单的介绍了Java内存模型、内存可见性和指令重排序。不过最后看来其实主要是在解释volatile这个关键字,我的感受volatile关键字是Java当中最使人困惑和最难理解的关键字。相对于synchronized块的代码锁,volatile应该是提供了一个轻量级的针对共享变量的锁,当咱们在多个线程间使用共享变量进行通讯的时候须要考虑将共享变量用volatile来修饰,对于须要使用volatile的各类情景,看到IBM Developer Works上有一篇文章总结的很不错,推荐一下: http://www.ibm.com/developerworks/cn/java/j-jtp06197.html程序员