Java Volatile
理解Java越多,就越发觉Java和C++的差异,这次是volatile。
共享
在C/C++中,volatile用于指示编译器对于这类变量的访问不要做优化,常用于一些硬件相关的读写中,在Java中,volatile的意思与C相似,但除了硬件相关外,还有一个更常见的使用场合,是用于多线程,在Java中,如果一个线程写变量,另一个线程读变量,读变量的线程可能不能“即时”获得被修改后的值,这是Java的一个实现约定,也是和JVM的实现相关,所以为了保证这种多线程共享变量的可见性,需要使用volatile。
互斥
要注意到,Java中synchronized也可以达到和volatile相同的作用,即使用synchronized做互斥时自动也达到了共享的目的,但反过来volatile就不能代替synchronized来做互斥,比如说非原子类型的变量(long/double之类)即使加volatile做++操作,也不是线程安全的,这时是需要使用synchronized的。
这样看来,Java中volatile的使用场合应该不是很多(因为多线程情况下,需要共享又不要互斥的情况不多),常见的使用诸如线程的控制循环退出的变量,一些标志变量等等,这些地方不涉及互斥,所以可以用volatile来简化。
相关文章
May 13th, 2008 at 11:41 am
您好, 博主, 感谢您昨天在偶爱偶家博客的留言, 不过比较遗憾, 您的评论由于我的插件被当作垃圾评论而被误杀了, 对此我向您表示歉意, 请见谅.
May 13th, 2008 at 12:15 pm
没关系啦,很正常,也许也是我留言太短了。我常去你博客转的。