并发编程第3章,共享对象 synchonized不仅仅是将代码块声明成原子操作,而且管理的变量在内存中的可见性,保证其他代码看到的值是真实的值。应该是直接操作主存
3.1可见性
由于java内存模型的关系,变量的可见性也变的有些诡异。jmm有主存和本地存储的区别。当一个变量的值在本地存储中改变了,那么其他线程从主存中读取值时,很有可能是不能及时获取到最新的值的。这就是可见性。
锁可以实现这种可见性,同时保证操作的原子性
而volatile也可以实现内存变量的可见性,强迫所有线程获取变量的值都从主存中获取。但volatile不能实现操作的原子性。比如i++操作,即使i被声明为volatile,那么有可能出现以下情况:线程A读取主存获得到值4,然后i++.此时线程B也读取获得的值依然为4,然后也i++。那么最终AB执行完毕之后,最终的值被覆盖,应该为6的操作,却变成了5
所以使用volatile的时候,需要注意,满足以下情况,方可放心使用:
1.对一个变量的写操作,不依赖于其当前值(i++操作显然不满足),或者保证单线程
2.在一个不变体中,变量不参与其他状态的计算,或者说其他状态不依赖与此变量
3.在不需要锁的情况下
3.2发布对象和对象的逃逸
所谓发布对象,指将一些对象公开,使得其他代码可以访问到他,具体的方式有:将变量存储在一个类变量中,或者从一个非私有的方法中返回对象,或者通过参数传递给另一个类。
所谓对象的逃逸是指,比如我将对象A发布,但是由于A持有B的引用,那么B也被隐式的发布了,那么B就算是逃逸了
如果通过一个公共的方法将一些可变的值返回了,那么这是不安全的,因为可能有多个线程访问这个方法,并且有可能,某些线程会修改这个方法的返回值,由于引用的关系,那么方法的返回值就被人篡改了。其他线程获取的值,有可能就不是你想要暴露给外界的值了。从而引起问题。
另外也不要再一个对象构造完毕之前,将他暴露给外界,比如:在构造器中启动线程
3.3线程封闭
线程封闭就是将变量限制在当前执行线程之中,从而保证数据ok
3.4不可变对象
不可变对象:对象创建之后,对象状态不能改变;所有的字段均为final;被合理地构造(无this逃逸)
不可变对象和volatile的配合可以保证变量,能及时从主存获取数据,同时数据是最新的
3.5安全的发布对象
1.通过静态初始化器初始化对象;
2.将一个对象的引用声明为volatile或者AtomicReference
3.将一个对象的引用声明为final并保证该对象能正确初始化
4.将一个对象的引用存储到一个通过锁保护的field中
对于jdk提供的同步的集合类来说,有些特性javadoc并没有说明清楚,实际上,如果将对象扔进这些同步的集合当中,那么再次取出来的时候,对象就是线程安全的
有些对象本身可能并不是不变类,但是如果在使用当中,我们并不修改它的状态,那么可以认为他也是不变类,如Date类。
如何安全的共享对象:
1.线程封闭的。
2.只读共享
3.线程安全的共享--对象内部同步
4.通过锁保持同步
分享到:
相关推荐
这本"Java并发编程学习笔记"可能是作者在深入研究Java并发特性、工具和最佳实践过程中积累的心得体会。下面,我们将根据这个主题,探讨一些关键的Java并发编程知识点。 1. **线程与进程**:在多任务环境中,线程是...
Java并发编程是Java开发中必不可少的一部分,涉及到多线程、同步机制、线程池以及并发工具类等多个核心知识点。以下是对这些主题的详细说明: 1. **线程安全与锁 Synchronized 底层实现原理**: 线程安全是指在多...
### Java并发编程学习笔记知识点详解 #### 一、Java并发编程概述 Java并发编程是指在Java应用程序中同时执行多个操作的技术。它通过多线程、线程池等机制实现资源的有效利用,提高程序运行效率。Java并发编程的...
### Java并发编程实践笔记知识点详解 #### 一、保证线程安全的方法 1. **不要跨线程访问共享变量:** 当多个线程共享某个变量时,若其中一个线程修改了该变量,其他线程若没有正确同步,则可能读取到错误的数据。...
Java并发编程学习笔记,研究JAVA并发多线程编程的一本教程,使用并发技术可以开发出并行算法,充分利用多处理器的计算能力,避免硬件资源浪费。目前,在JAVA并发编程方面的论述系统且内容详实的技术资料不太多,Java...
"JUC并发编程学习笔记(硅谷)"很可能包含了关于Java并发工具集(Java Util Concurrency, JUC)的深入理解和实战经验。JUC是Java标准库提供的一套强大的并发处理工具,它极大地简化了多线程编程,提高了程序的可读性...
2. **并发基础**:Java并发编程的基础包括`Thread.start()`启动线程,`Thread.join()`等待线程结束,以及`Thread.sleep()`让当前线程暂停一段时间。 3. **同步机制**:Java提供了多种同步机制,如`synchronized`...
本文将基于文档《Java并发编程与高并发解决方案-学习笔记***.pdf》中提供的内容,来详细阐述并发编程和高并发的基本概念、CPU多级缓存与缓存一致性、以及Java内存模型。 ### 并发与高并发概念 在现代多线程编程中...
Java并发编程系列心得笔记,可以参考,欢迎共同交流学习
标题“多线程与高并发编程笔记、源码等”表明了资源的核心内容,涵盖了多线程和高并发编程的理论与实践。多线程允许一个应用程序同时执行多个任务,而高并发则指系统能够处理大量并发请求的能力。这两个概念在现代...
Java并发编程 背景介绍 并发历史 必要性 进程 资源分配的最小单位 线程 CPU调度的最小单位 线程的优势 (1)如果设计正确,多线程程序可以通过提高处理器资源的利用率来提升系统吞吐率 ...
通过阅读"Go语言学习笔记",你可以建立起对Go语言全面的认知,然后借助"Go并发编程实战"来深化对并发编程的理解,结合实际编写示例程序,将理论知识转化为实践经验。 在学习过程中,建议先从基础语法开始,掌握变量...
综上所述,这一系列学习笔记涵盖了并发编程的关键概念和实战技巧,包括Java内存模型、线程池、并发容器的使用以及常见数据结构的线程安全问题。通过深入学习这些内容,开发者可以更好地理解和解决多线程环境下的编程...
Java并发编程与高并发解决方案是开发高性能应用的关键技术。在基础篇中,主要涉及以下几个重要知识点: 1. **并发编程基础** - **并发**:并发是指在一个时间段内,多个线程交替执行,使得系统看起来像是同时处理...
java并发编程与并发解决方案是自己多年开发和学习的笔记,有助于(ˇˍˇ) 想~进一步提高的java开发工程师或架构师深入的学习java架构并发处理。同时,它也是 在实际工作中多年高并发解决方案和经验的总结
并发编程与高并发解决方案的学习笔记中,首先对并发与高并发进行了基本概念的介绍。并发指的是同时存在多个执行单元,但并不一定同时发生;而高并发是指系统能够同时处理很多的请求,这对于互联网分布式系统架构设计...
01-并发编程之深入理解JMM&并发三大特性(一)-fox 02-并发编程之深入理解JMM&并发三大特性(二)-fox 03-01-HashMap源码解析-monkey 03-并发List、Set、 ConcurrentHashMap底层原理剖析-monkey 04-Java并发线程池...