一、如何理解线程安全

在多线程中稍微不注意就会出现线程安全问题,那么什么是线程安全问题?

我的认识是。在多线程下代码执行的结果和预期的正确的结果不一致,该代码就是线程不安全的,否则就是线程安全的

在深入理解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并发---并发理论的更多相关文章

  1. [Java并发编程(四)] Java volatile 的理论实践

    [Java并发编程(四)] Java volatile 的理论实践 摘要 Java 语言中的 volatile 变量可以被看作是一种 "程度较轻的 synchronized":与 ...

  2. [ 高并发]Java高并发编程系列第二篇--线程同步

    高并发,听起来高大上的一个词汇,在身处于互联网潮的社会大趋势下,高并发赋予了更多的传奇色彩.首先,我们可以看到很多招聘中,会提到有高并发项目者优先.高并发,意味着,你的前雇主,有很大的业务层面的需求, ...

  3. 《实战java高并发程序设计》源码整理及读书笔记

    日常啰嗦 不要被标题吓到,虽然书籍是<实战java高并发程序设计>,但是这篇文章不会讲高并发.线程安全.锁啊这些比较恼人的知识点,甚至都不会谈相关的技术,只是写一写本人的一点读书感受,顺便 ...

  4. 2017.4.26 慕课网--Java 高并发秒杀API(一)

    Java高并发秒杀API系列(一) -----------------业务分析及Dao层 第一章 课程介绍 1.1 内容介绍及业务分析 (1)课程内容 SSM框架的整合使用 秒杀类系统需求理解和实现 ...

  5. java高并发系列 - 第3天:有关并行的两个重要定律

    有关为什么要使用并行程序的问题前面已经进行了简单的探讨.总的来说,最重要的应该是处于两个目的. 第一,为了获得更好的性能: 第二,由于业务模型的需要,确实需要多个执行实体. 在这里,我将更加关注第一种 ...

  6. Python并发编程理论篇

    Python并发编程理论篇 前言 其实关于Python的并发编程是比较难写的一章,因为涉及到的知识很复杂并且理论偏多,所以在这里我尽量的用一些非常简明的语言来尽可能的将它描述清楚,在学习之前首先要记住 ...

  7. 关于Java高并发编程你需要知道的“升段攻略”

    关于Java高并发编程你需要知道的"升段攻略" 基础 Thread对象调用start()方法包含的步骤 通过jvm告诉操作系统创建Thread 操作系统开辟内存并使用Windows ...

  8. Java线程并发:知识点

    Java线程并发:知识点   发布:一个对象是使它能够被当前范围之外的代码所引用: 常见形式:将对象的的引用存储到公共静态域:非私有方法中返回引用:发布内部类实例,包含引用.   逃逸:在对象尚未准备 ...

  9. 【实战Java高并发程序设计 7】让线程之间互相帮助--SynchronousQueue的实现

    [实战Java高并发程序设计 1]Java中的指针:Unsafe类 [实战Java高并发程序设计 2]无锁的对象引用:AtomicReference [实战Java高并发程序设计 3]带有时间戳的对象 ...

  10. 【实战Java高并发程序设计6】挑战无锁算法:无锁的Vector实现

    [实战Java高并发程序设计 1]Java中的指针:Unsafe类 [实战Java高并发程序设计 2]无锁的对象引用:AtomicReference [实战Java高并发程序设计 3]带有时间戳的对象 ...

随机推荐

  1. 通过jmeter读取csv的case来实现接口自动化

    一.环境准备: 1.环境:jdk:1.8+,jmeter:4.2+, 2.csv: 按照以下这种方式编写case或者自定义其他的,准备好case 二.注意要点: 1.想实现数据参数化,可以直接csv中 ...

  2. vue中使用触摸事件,上滑,下滑,等

    第一步,下载一个包 npm install kim-vue-touch -s 在当前项目中下载包 第二部 import vueTouch from 'kim-vue-touch' Vue.use(vu ...

  3. 给Django Admin添加验证码和多次登录尝试限制

    Django自带的Admin很好用,但是放到生产环境总还差了点什么= = 看看admin的介绍: Django奉行Python的内置电池哲学.它自带了一系列在Web开发中用于解决常见问题或需求的额外的 ...

  4. pandas之数值计算与统计

    数值计算与统计 对于DataFrame来说,求和.最大.最小.平均等统计方法,默认是按列进行统计,即axis = 0,如果添加参数axis = 1则会按照行进行统计. 如果存在空值,在统计时默认会忽略 ...

  5. Android中的ANR问题

    ANR:(Application Not Responding) 1.为什么会产生ANR 在Android中App的相应能力是由Activity Manager和Window Manager系统服务来 ...

  6. 构建私有的verdaccio npm服务

    用了很长一段时间的cnpmjs做库私有库,发现两个问题 1. 最开始是mysql对表情emoij的支持不好,但由于数据库没办法调整所以只好把第三方库都清掉,只留私有库 2. mac 上面cnpm in ...

  7. 总结HashMap实现原理分析

    一.底层数据结构在JDK1.6,JDK1.7中,HashMap采用位桶+链表实现,即使用链表处理冲突,同一hash值的键值对会被放在同一个位桶里,当桶中元素较多时,通过key值查找的效率较低. 而JD ...

  8. Label 组件基本写法

    1.width,height 指定区域大小 文本 汉字 2 个字节 2.font 指定字体和字体大小 font(font_name,size) 3.image 显示在 Label 上的图像 支持 gi ...

  9. luogu P1721 [NOI2016]国王饮水记 斜率优化dp 贪心 决策单调性

    LINK:国王饮水记 看起来很不可做的样子. 但实际上还是需要先考虑贪心. 当k==1的时候 只有一次操作机会.显然可以把那些比第一个位置小的都给扔掉. 然后可以得知剩下序列中的最大值一定会被选择. ...

  10. CF R 630 div2 1332 F Independent Set

    LINK:Independent Set 题目定义了 独立集和边诱导子图.然而和题目没有多少关系. 给出一棵树 求\(\sum_{E'\neq \varnothing,E'\subset E}w(G( ...