Skip to content

Commit

Permalink
Merge branch 'master' of github.com:hollischuang/toBeTopJavaer
Browse files Browse the repository at this point in the history
  • Loading branch information
hollis.zhl committed Mar 15, 2021
2 parents 3c2eb60 + 3cb1cc8 commit 506a4db
Showing 1 changed file with 7 additions and 7 deletions.
14 changes: 7 additions & 7 deletions docs/basics/concurrent-coding/volatile.md
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@
return singleton;
}
}


如以上代码是一个比较典型的使用双重锁校验的形式实现单例的其中使用`volatile`关键字修饰可能被多个线程同时访问到的singleton

Expand All @@ -44,7 +44,7 @@

可见性是指当多个线程访问同一个变量时一个线程修改了这个变量的值其他线程能够立即看得到修改的值

我们在[再有人问你Java内存模型是什么就把这篇文章发给他][1]中分析过Java内存模型规定了所有的变量都存储在主内存中每条线程还有自己的工作内存线程的工作内存中保存了该线程中是用到的变量的主内存副本拷贝线程对变量的所有操作都必须在工作内存中进行而不能直接读写主内存不同的线程之间也无法直接访问对方工作内存中的变量线程间变量的传递均需要自己的工作内存和主存之间进行数据同步进行所以就可能出现线程1改了某个变量的值但是线程2不可见的情况
我们在[再有人问你Java内存模型是什么就把这篇文章发给他][1]中分析过Java内存模型规定了所有的变量都存储在主内存中每条线程还有自己的工作内存线程的工作内存中保存了该线程中使用到的变量的主内存副本拷贝线程对变量的所有操作都必须在工作内存中进行而不能直接读写主内存不同的线程之间也无法直接访问对方工作内存中的变量线程间变量的传递均需要自己的工作内存和主存之间进行数据同步进行所以就可能出现线程1改了某个变量的值但是线程2不可见的情况

前面的关于`volatile`的原理中介绍过了Java中的`volatile`关键字提供了一个功能那就是被其修饰的变量在被修改后可以立即同步到主内存被其修饰的变量在每次使用之前都从主内存刷新因此可以使用`volatile`来保证多线程操作时变量的可见性

Expand Down Expand Up @@ -103,7 +103,7 @@ volatile可以禁止指令重排,这就保证了代码的程序会严格按照
System.out.println(test.inc);
}
}


以上代码比较简单就是创建10个线程然后分别执行1000次`i++`操作正常情况下程序的输出结果应该是10000但是多次执行的结果都小于10000这其实就是`volatile`无法满足原子性的原因

Expand All @@ -129,10 +129,10 @@ volatile可以禁止指令重排,这就保证了代码的程序会严格按照
return singleton;
}
}


答案我们在下一篇文章既生synchronized何生亮volatile中介绍敬请关注我的博客(http://47.103.216.138)和公众号(Hollis)。

[1]: http://47.103.216.138/archives/2550
[2]: http://47.103.216.138/archives/2637
[3]: http://47.103.216.138/archives/2618
[1]: http://47.103.216.138/archives/2550
[2]: http://47.103.216.138/archives/2637
[3]: http://47.103.216.138/archives/2618

0 comments on commit 506a4db

Please sign in to comment.