volatile是一种程度较轻的同步机制,它的作用就是在于某个线程修改了变量之后,其他线程看到的变量值也同步了,提高了可见性。但是要通过volatile来实现真正的同步,也是有条件的
1、对变量的写操作不依赖于当前值。
2、该变量没有包含在具有其他变量的不变式中。
满足了以上两个条件,才能通过volatile实现真正的同步
第一个条件指的是n++,n=n+1这种情况
第二个条件通过以下例子来形容
@NotThreadSafe public class NumberRange { private int lower, upper; public int getLower() { return lower; } public int getUpper() { return upper; } public void setLower(int value) { if (value > upper) throw new IllegalArgumentException(...); lower = value; } public void setUpper(int value) { if (value < lower) throw new IllegalArgumentException(...); upper = value; } } |
这种方式限制了范围的状态变量,因此将 lower
和 upper 字段定义为 volatile 类型不能够充分实现类的线程安全;从而仍然需要使用同步。否则,如果凑巧两个线程在同一时间使用不一致的值执行 setLower
和 setUpper
的话,则会使范围处于不一致的状态。例如,如果初始状态是 (0, 5)
,同一时间内,线程 A 调用 setLower(4)
并且线程 B 调用 setUpper(3)
,显然这两个操作交叉存入的值是不符合条件的,那么两个线程都会通过用于保护不变式的检查,使得最后的范围值是 (4, 3)
—— 一个无效值。至于针对范围的其他操作,我们需要使 setLower()
和 setUpper()
操作原子化 —— 而将字段定义为 volatile 类型是无法实现这一目的的。
相关推荐
volatile这个关键字,不仅仅在Java语言中有,在很多语言中都有的,而且其用法和语义也都是不尽相同的。这篇文章主要介绍了Java中的volatile关键字,需要的朋友可以参考下
volatile关键字虽然从字面上理解起来比较简单,但是要用好不是一件容易的事情。这篇文章主要介绍了Java中volatile关键字的作用与用法详解的相关资料,需要的朋友可以参考下
volatile这个关键字可能很多朋友都听说过,或许也都用过。在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果,本文给大家介绍java中volatile关键字,需要的朋友参考下
主要介绍了Java中Volatile关键字的相关知识,文章讲解非常详细,代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下
volatile 关键字是一个神秘的关键字,也许在 J2EE 上的 JAVA 程序员会了解多一点,但在 Android 上的 JAVA 程序员大多不了解这个关键字。只要稍了解不当就好容易导致一些并发上的错误发生,例如好多人把 volatile ...
主要介绍了java并发之volatile关键字的的相关资料,文中代码非常详细,帮助大家更好的理解和学习,感兴趣的朋友可以了解下
主要介绍了Java并发编程volatile关键字的作用,文中示例代码非常详细,帮助大家更好的理解和学习,感兴趣的朋友可以了解下
本文主要介绍 volatile 的使用准则,以及使用过程中需注意的地方,感兴趣的朋友一起看看吧
在Java语言中,volatile关键字是一种特殊的关键字,用于标记变量的可见性。当一个变量被标记为volatile时,它的值将被强制刷新到主存储器中,从而确保其他线程可以看到最新的值。volatile关键字还可以强制处理器按照...
您将了解线程安全、死锁、线程池、线程上下文切换、线程同步和互斥、volatile关键字、synchronized关键字等重要知识点。此外,还探讨了线程间通信、线程优先级、守护线程、线程组、可重入锁、线程局部变量等关键概念...
本资源为您提供了关于 Java ...volatile 关键字: 解释 volatile 关键字的作用,探讨如何使用 volatile 实现线程间的可见性和有序性。 通过这份资源,将为您提供实用的指导,帮助您构建更稳定、可靠的多线程应用程序。
16、说说你对Java反射的理解 17、说说你对Java注解的理解 18、Java中String的了解 19、String为什么要设计成不可变的? 20、Object类的equal和hashCode方法重写,为什么? 21-40题 21、List,Set,Map的区别 26...
, 这里,读者将通过使用java.lang.thread类、synchronized和volatile关键字,以及wait、notify和notifyall方法,学习如何初始化、控制和协调并发操作。此外,本书还提供了有关并发编程的全方位的详细内容,例如限制...
1.Day01-jdk8新特性 ---【课时1】01-JDK8简介.mp4 ---【课时2】02-JDK8接口新特性应用.mp4 ---【课时3】03-JDK8中lambda表达式应用.mp4 ---【课时4】04-JDK8中的方法...---【课时6】06-volatile关键字应用分析.mp4 -
Java 知识点,继续完善中。 多数是一些 Java 基础知识、底层原理、算法详解。...你应该知道的 volatile 关键字 分布式相关 分布式限流 基于 Redis 的分布式锁 分布式缓存设计 分布式 ID 生成器 常用框架\
Java 知识点,继续完善中。 多数是一些 Java 基础...你应该知道的 volatile 关键字 分布式相关 分布式限流 基于 Redis 的分布式锁 分布式缓存设计 分布式 ID 生成器 常用框架\第三方组件 Spring Bean 生命周期 Sprin
Java 知识点,继续完善中。 多数是一些 Java 基础知识、底层原理、算法详解。...你应该知道的 volatile 关键字 分布式相关 分布式限流 基于 Redis 的分布式锁 分布式缓存设计 分布式 ID 生成器 常用框架\
在 Java 中,关键字 synchronized可以保证在同一个时刻,只有一个线程可以执行某个方法或者某个代码块(主要是对方法或者代码块中存在共享数据的操作),同时我们还应该注意到synchronized另外一个重要的作用,...
83_AtomicIntegerFieldUpdater实例演练与volatile关键字分析;84_Netty引用计数注意事项与内存泄露检测方式;85_Netty编解码器剖析与入站出站处理器详解;86_Netty自定义编解码器与TCP粘包拆包问题;87_Netty编解码...
观事务的软件化模拟,是变量(数据和数据结构)和相关方法(对数据操作和对象管理的程 序)的软件组合。 在面向对象的程序设计中,你可以用软件对象表示现实世界的对象,而这些软件对象和 现实世界对象是相对应的。...