当读操作和写操作发生在不同的线程中,对共享变量的读和写操作会产生意料之外的结果。为了确保多个线程之间对内存写入操作的可见性,必须使用同步机制。
加锁的含义不仅仅局限于互斥行为,还包括内存可见性。为了确保所有线程都能看到共享变量的最新值,所有执行读操作或者写操作的线程都必须在同一个锁上进行。
造成内存可见性问题的情况有:
1.编译器重排序。
当在没有同步机制保护的情况下读取某个共享变量,编译器可能会对代码的执行顺序进行重排序,常见的情况有在while循环中判断一个共享的boolean变量,而在while循环中又没有更改该boolean变量的值,而是在其他线程中修改该值,并且此时jvm的启动模式为-server(server模式会做更多的编译优化),就可能会发生编译器重排序现象。
2.对于共享数据的多线程读写操作,没有使用同一个锁进行保护。
常见的现象是,虽然对一个共享对象的私有属性进行了get和set封装,但在get set方法中没有使用同一个锁进行同步保护,在使用set方法的时候,其他线程依然可以使用get方法对私有属性进行读取而不受互斥保护。
3.非原子的64位操作。
在64位JVM中,允许将一个64位的读操作或者写操作分解为两个32位操作,所以,如果在读取一个非volatile类型的long或者double变量时,如果对该变量的读操作和写操作在不同的线程中执行,那么很可能会读到某个值的高32位和另一个值的低32位。所以,在多线程程序中使用共享且可变的long或者double等类型的变量也是不安全的,除非用关键字volatile来声明他们,或者用锁保护起来。
Volatile变量
当把变量声明为volatile类型后,编译器与运行时都会注意到这个变量是共享的,因此不会将该变量上的操作与其他内存操作一起重排序。volatile变量不会被缓存在寄存器或者对其他处理器不可见的地方。在访问volatile变量时不会执行加锁操作,因此也就不会使执行线程阻塞,因此volatile变量是一种比synchronized关键字更为轻量级的同步机制。
但在使用volatile变量时需要注意,因为其在访问时不会执行加锁操作,所以它只适合使用在一些特别简单的读写访问场合,比如只对该变量进行一次读或者写操作,如果需要对可见性进行复杂的判断(比如先判断后改写),那么就不应该使用这种同步策略。
相关推荐
### Java并发编程实践笔记知识点详解 #### 一、保证线程安全的方法 1. **不要跨线程访问共享变量:** 当多个线程共享某个变量时,若其中一个线程修改了该变量,其他线程若没有正确同步,则可能读取到错误的数据。...
Java并发编程实践是Java...通过这些笔记,我们可以了解到Java并发编程中的关键概念和实践,对于理解和编写高效的并发代码具有极大的帮助。在实际开发中,需要根据具体需求灵活应用这些知识,以保证程序的稳定性和性能。
《JAVA并发编程实践》随着多核处理器的普及,使用并发成为构建高性能应用程序的关键。Java 5以及6在开发并发程序中取得了显著的进步,提高了Java虚拟机的性能以及并发类的可伸缩性,并加入了丰富的新并发构建块。在...
其次,书中深入剖析了Java内存模型(JMM)和可见性问题,这是理解并发编程中数据一致性问题的基础。Java的volatile关键字、synchronized块和方法、以及Atomic类都是解决这些问题的关键工具。作者通过实际案例解释了...
### C++并发编程实践 #### 一、简介与并发编程基础 《C++并发编程实践》这本书由Anthony Williams编写,是一本深入讲解C++多线程编程技术的专业书籍。本书旨在帮助读者掌握C++中的并发编程技巧,并通过大量的示例...
这本"Java并发编程学习笔记"可能是作者在深入研究Java并发特性、工具和最佳实践过程中积累的心得体会。下面,我们将根据这个主题,探讨一些关键的Java并发编程知识点。 1. **线程与进程**:在多任务环境中,线程是...
《JAVA并发编程实践》适合于具有一定Java编程经验的程序员、希望了解Java SE 5以及6在线程技术上的改进和新特性的程序员,以及Java和并发编程的爱好者。 作者简介 作者:(美)戈茨 等 本书作者系lava标准化组织...
Java并发编程是Java开发中必不可少的一部分,涉及到多线程、同步机制、线程池以及并发工具类等多个核心知识点。以下是对这些主题的详细说明: 1. **线程安全与锁 Synchronized 底层实现原理**: 线程安全是指在多...
《Java并发编程实践》这本书深入探讨了Java平台上的并发编程技术,涵盖了从基础概念到高级策略的广泛主题。在Java编程中,并发处理是优化性能、提高系统资源利用率的关键手段,尤其是在多核处理器和分布式系统中更为...
接着,书中会深入讨论Java内存模型(JMM)和volatile关键字,这两个概念对于理解和解决并发编程中的可见性、有序性和原子性问题至关重要。同时,书中还会涵盖synchronized关键字的用法,包括可重入锁、同步块和同步...
Java线程与并发编程实践是Java开发者必备的技能之一,特别是在多核处理器和高并发应用环境中,有效地管理和利用线程能极大地提升程序的性能。本书《java线程与并发实践编程》由Jeff Friesen撰写,2017年2月出版,...
### Java并发编程实践 #### 书籍概述 《Java并发编程实践》是一本由Brian Goetz等人编写的关于Java并发编程的经典著作。本书深入浅出地介绍了Java 5.0及之后版本中新增加的并发特性,并对并发编程进行了全面而详尽...
《Java并发编程实践》是关于Java语言在并发编程领域的实践指南,作者在本书中详细介绍了在Java编程中,如何高效地实现多线程程序的设计和开发。本书不仅为初学者提供了理论基础,还为有经验的开发者提供了优化并发...
9. **JVM内存模型**:Java内存模型(JMM)规定了线程之间的共享变量如何交互和可见性,对理解并发编程有深远影响。 通过阅读《JAVA并发编程实践》,读者可以深入了解Java并发编程的原理和最佳实践,从而写出更加...
本篇文章将深入探讨Java并发编程的相关知识点,主要基于提供的两个文件——"Java并发编程实战(中文版).pdf"和"Java Concurrency in Practice.pdf"。 1. **线程与并发** - **线程基础**:Java中的线程是并发执行...
Thinking in Java 自学笔记——第一章 对象导论 本章节总结了面向对象程序设计(Object-oriented Programming, OOP)的基本概念和原则,以帮助读者更好地理解 Java 编程语言。以下是对标题、描述、标签和部分内容的...
《Java并发编程实践》这本书是Java开发者深入理解并发编程的重要参考资料。并发和多线程是现代计算机系统中不可或缺的部分,特别是在Java这样的多线程支持语言中。本书详细介绍了如何在Java环境中有效地设计和实现...
Java并发编程实践-电子书-01章.pdf Java并发编程实践-电子书-02章.pdf Java并发编程实践-电子书-03章.pdf Java并发编程实践-电子书-04章.pdf Java并发编程实践-电子书-05章.pdf Java并发编程实践-电子书-06章.pdf ...