Java并发---并发理论
一、如何理解线程安全
在多线程中稍微不注意就会出现线程安全问题,那么什么是线程安全问题?
我的认识是。在多线程下代码执行的结果和预期的正确的结果不一致,该代码就是线程不安全的,否则就是线程安全的
在深入理解Java虚拟机一书中看到的定义时
当多个线程访问同一个对象时,如果不用考虑这些线程在运行环境下的调度和交替运行,也不需要进行额外的同步,或者在调用方进行任何其他的协调操作,调用这个对象的行为都可以获取正确的结果,那么这个对象时线程的
在多线程条件下,多个线程肯定会相互协作完成一件事,一般来说就会涉及到多个线程将相互通信告知彼此状态以及当前执行结果等,另外为了性能优化,还会涉及到编辑器指令重排序和处理器指令重排序
二、并发编程中的主要解决哪两个问题
1、线程之间如何通信
通信是指线程之间以何种机制来交换信息,主要有两种:共享内存和消息传递
2、线程之间如何完成同步(这里的线程指的是并发执行的活动实体)
Java内存模型是共享内存的并发模型,线程之间主要通过读-写共享变量来完成隐式通信。
三、JVM中的共享变量和线程独占变量
共享变量
在Java中所有实例域,静态域和数组元素都是放在堆内存中(所有线程均可以访问到,是可以共享的)。
线程独占
局部变量,方法定义参数和异常处理器参数不会在线程间共享
共享数据会出现线程安全的问题,而非共享数据不会出现线程安全的问题
四、描述一下JMM的抽象结构模型
我们知道CPU的处理速度和主存的读写速度不是一个量级的,为了平衡这种巨大的差距,每个CPU都会有缓存。因此,共享变量会先放在主存中,每个线程都有属于自己的工作内存,并且会把位于主存中的共享变量拷贝到自己的工作内存中,之后读写操作均使用位于工作内存的变量副本,并且在某个时刻将工作内存的变量副本写到主存中去。JMM就从抽象层定义了这种方式,并且JMM决定了一个线程对共享变量的写入何时对其他线程是可见的。

如图为JMM抽象示意图,线程A和线程B 之间要完成通信的话,要经理如下两步:线程A从主内存中将共享变量读入线程A 的工作内存后并进行操作,之后将数据重新写会主内存中;线程B从主内存中读取最新的共享变量。
从横向去看,线程A和线程B好像通过共享变量在进行隐式通信。这其中就有个问题,如果线程A更新后数据并没有及时的写回,而此时线程B读到了过期的数据,这就出现了脏读现象,可以通过同步机制(控制不同线程操作发生的相对顺序)来解决或者通过valatitl关键字是的每次volatitl变量都能够强制刷新到主存,从而对每个线程都是可见的
五、由于JMM,多线程情况下可能出现哪些问题
从上面内存抽象结构来说,可能出现数据脏读的现象,这就是数据可见性的问题。另外,重排序在多线程中不注意的话也容易存在一些问题,比如一个经典的问题DCL(双重检验锁),这就是需要禁止重排序。另外,在多线程下原子操作例如:i++不加注意也容易出现线程安全的问题。
单总的来说,在多线程开发时需要从原子性、有序性、可见性三个方面进行考虑。
J.U.C包下的并发工具类和并发容器也是需要花时间去掌握的。
Java并发---并发理论的更多相关文章
- [Java并发编程(四)] Java volatile  的理论实践
		[Java并发编程(四)] Java volatile 的理论实践 摘要 Java 语言中的 volatile 变量可以被看作是一种 "程度较轻的 synchronized":与 ... 
- [ 高并发]Java高并发编程系列第二篇--线程同步
		高并发,听起来高大上的一个词汇,在身处于互联网潮的社会大趋势下,高并发赋予了更多的传奇色彩.首先,我们可以看到很多招聘中,会提到有高并发项目者优先.高并发,意味着,你的前雇主,有很大的业务层面的需求, ... 
- 《实战java高并发程序设计》源码整理及读书笔记
		日常啰嗦 不要被标题吓到,虽然书籍是<实战java高并发程序设计>,但是这篇文章不会讲高并发.线程安全.锁啊这些比较恼人的知识点,甚至都不会谈相关的技术,只是写一写本人的一点读书感受,顺便 ... 
- 2017.4.26 慕课网--Java 高并发秒杀API(一)
		Java高并发秒杀API系列(一) -----------------业务分析及Dao层 第一章 课程介绍 1.1 内容介绍及业务分析 (1)课程内容 SSM框架的整合使用 秒杀类系统需求理解和实现 ... 
- java高并发系列 - 第3天:有关并行的两个重要定律
		有关为什么要使用并行程序的问题前面已经进行了简单的探讨.总的来说,最重要的应该是处于两个目的. 第一,为了获得更好的性能: 第二,由于业务模型的需要,确实需要多个执行实体. 在这里,我将更加关注第一种 ... 
- Python并发编程理论篇
		Python并发编程理论篇 前言 其实关于Python的并发编程是比较难写的一章,因为涉及到的知识很复杂并且理论偏多,所以在这里我尽量的用一些非常简明的语言来尽可能的将它描述清楚,在学习之前首先要记住 ... 
- 关于Java高并发编程你需要知道的“升段攻略”
		关于Java高并发编程你需要知道的"升段攻略" 基础 Thread对象调用start()方法包含的步骤 通过jvm告诉操作系统创建Thread 操作系统开辟内存并使用Windows ... 
- Java线程并发:知识点
		Java线程并发:知识点 发布:一个对象是使它能够被当前范围之外的代码所引用: 常见形式:将对象的的引用存储到公共静态域:非私有方法中返回引用:发布内部类实例,包含引用. 逃逸:在对象尚未准备 ... 
- 【实战Java高并发程序设计 7】让线程之间互相帮助--SynchronousQueue的实现
		[实战Java高并发程序设计 1]Java中的指针:Unsafe类 [实战Java高并发程序设计 2]无锁的对象引用:AtomicReference [实战Java高并发程序设计 3]带有时间戳的对象 ... 
- 【实战Java高并发程序设计6】挑战无锁算法:无锁的Vector实现
		[实战Java高并发程序设计 1]Java中的指针:Unsafe类 [实战Java高并发程序设计 2]无锁的对象引用:AtomicReference [实战Java高并发程序设计 3]带有时间戳的对象 ... 
随机推荐
- Python编程之美:最佳实践指南PDF高清完整版免费下载|百度云盘|Python新手到进阶
			百度云盘:Python编程之美:最佳实践指南PDF高清完整版免费下载 提取码:1py6 内容简介 <Python编程之美:最佳实践指南>是Python用户的一本百科式学习指南,由Pytho ... 
- 宿主机连接docker中的mysql
			宿主机连接docker中的mysql dokcer安装mysql docker run \ --name mysql \ -v $PWD/mysql:/var/lib/mysql \ -p 330 ... 
- 给我半首歌的时间,给你说明白Immutable List
			先看再点赞,给自己一点思考的时间,微信搜索[沉默王二]关注这个靠才华苟且的程序员.本文 GitHub github.com/itwanger 已收录,里面还有一线大厂整理的面试题,以及我的系列文章. ... 
- 远光武汉研发中心区块链事业部Java面试总结
			面试在约定的时间准时进行,也是采用腾讯会议远程面试的方式.但是这是我第一次遇到面试官未打开摄像头的情况,后面经过沟通,双方都打开摄像头进行交流. 之前了解这个岗位主要是区块链相关的Java开发,所以事 ... 
- Servlet学习之Tomcat控制台中文乱码问题
			Tomcat控制台中文乱码问题 在更新了IDEA2020.1版本后,可以安装官方的简体中文插件,方便我们日常使用,但是更新后再运行Tomcat时,控制台的输出日志出现中文乱码问题,接下来告诉大家如何修 ... 
- == 和 is 的区别
			import copy a = ['a','b','c'] b = a #b和a引用自同一块地址空间 print("a==b :",a==b) print("a is b ... 
- PHP NULL 合并运算符
			HP 7 新增加的 NULL 合并运算符(??)是用于执行isset()检测的三元运算的快捷方式. NULL 合并运算符会判断变量是否存在且值不为NULL,如果是,它就会返回自身的值,否则返回它的第二 ... 
- PHP image2wbmp - 输出WBMP图片
			image2wbmp — 以 WBMP 格式将图像输出到浏览器或文件.高佣联盟 www.cgewang.com 语法 int image2wbmp ( resource $image [, strin ... 
- CF R 630 div2 1332 F Independent Set
			LINK:Independent Set 题目定义了 独立集和边诱导子图.然而和题目没有多少关系. 给出一棵树 求\(\sum_{E'\neq \varnothing,E'\subset E}w(G( ... 
- SparkSQL JDBC和JDBCServer区别
			注意SparkSQL JDBC和SparkSQL JDBCSever是完全两种不同的场景. SparkSQL JDBC SparkSQL可以使用JDBC的方式访问其他数据库,和普通非spark程序访问 ... 
