前几天并发编程群里有同学对volatile的用法提出了疑问,刚好我记得Twitter有关实时搜索的这个PPT对这个问题解释的很清晰并有一个实际的应用场景,于是周末把这个问题摘录了一些和并发相关的内容如下:
并发 – 定义
悲观锁 – Pressimistic locking
乐观锁 – Optimistic locking
非阻塞算法 – Non-blocking algorithm
无锁算法 – Lock-free algorithm
无等待算法 – Wait-free algorithm
Java的并发
Java内存模型
代码顺序规则
volatile变量规则
传递性
Safe publication案例
class VolatileExample { int x = 0; volatile int b = 0; private void write() { x = 5; b = 1; } private void read() { int dummy = b; while (x != 5) { } } public static void main(String[] args) throws Exception { final VolatileExample example = new VolatileExample(); Thread thread1 = new Thread(new Runnable() { public void run() { example.write(); } }); Thread thread2 = new Thread(new Runnable() { public void run() { example.read(); } }); thread1.start(); thread2.start(); thread1.join(); thread2.join(); } }
x并不需要定义为volatile
, 程序里可以有需要类似x的变量,我们只需要一个volatile变量b来确保线程a能看到线程1对x的修改:
JSR-133
在JSR-133之前的旧Java内存模型中,虽然不允许volatile变量之间重排序,但旧的Java内存模型仍然会允许volatile变量与普通变量之间重排序。JSR-133则增强了volatile的内存语义:严格限制编译器(在编译器)和处理器(在运行期)对volatile变量与普通变量的重排序,确保volatile的写-读和监视器的释放-获取一样,具有相同的内存语义。
延伸阅读: JSR-133: JavaTM Memory Model and Thread Specification, The JSR-133 Cookbook for Compiler Writers
参考链接
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/140968.html