千锋西安Java培训分享之编程中的五个特性分析

    作者:千锋西安 提交日期:2018-02-06 15:38:43

      千锋西安java培训,能给你专业技术知识的才能称为是真正技术求学的殿堂。千锋作为专业java技术培训机构,成就了千千万万学子的IT梦,打造了无数学生的自由高薪梦。经过统计调查,发现学生在学习java时,并发编程总是一个很难掌握的技术点,小编请教了千锋老师,整理了一篇关于并发编程技术性能分析,助攻每一位在java编程路上不断成长的小伙伴。

      


      并发编程是Java程序员很重要的技能之一,也是很难掌握的一种技能。它要求编程者对计算机底层的运作原理有深刻的理解,同时要求编程者逻辑清晰、思维缜密,这样才能写出高效、安全、可靠的多线程并发程序。
      接下来,西安千锋Java培训讲师将从以下五个方面进行分析:
      一、共享性
      数据共享性是线程安全的主要原因之一。如果所有的数据只是在线程内有效,那就不存在线程安全性问题,这也是我们在编程的时候经常不需要考虑线程安全的主要原因之一。
      但是,在多线程编程中,数据共享是不可避免的。一个典型的场景就是数据库中的数据,为了确保数据的一致性,我们通常需要共享同一个数据库中数据,即使是在主从的情况下,访问的也同一份数据,主从只是为了访问的效率和数据安全,而对同一份数据做的副本。
      二、互斥性
      资源互斥是指同时只允许一个访问者对其进行访问,具有唯一性和排它性。我们通常允许多个线程同时对数据进行读操作,但同一时间内只允许一个线程对数据进行写操作。所以我们通常将锁分为共享锁和排它锁,也叫做读锁和写锁。如果资源不具有互斥性,即使是共享资源,我们也不需要担心线程安全。
      三、原子性
      原子性就是指对数据的操作是一个独立的、不可分割的整体。换句话说,就是一次操作,是一个连续不可中断的过程,数据不会执行的一半的时候被其他线程所修改。
      确保原子性的一个简单的方式就是操作系统指令,就是说如果一次操作对应一条操作系统指令,这样肯定可以能确保原子性。但是很多操作不能经过一条指令就完成。
      四、可见性
      要理解可见性,需要先对JVM的内存模型有一定的了解,JVM的内存模型与操作系统类似,如图所示:

      


      从这个图中我们可以看出,每个线程都有一个自己的工作内存(相当于CPU高级缓冲区,这么做的目的还是在于进一步缩小存储系统与CPU之间速度的差异,提高性能),对于共享变量,线程每次读取的是工作内存中共享变量的副本,写入的时候也直接修改工作内存中副本的值,然后在某个时间点上再将工作内存与主内存中的值进行同步。
      这样导致的问题是,如果线程1对某个变量进行了修改,线程2却有可能看不到线程1对共享变量所做的修改。
      五、顺序性
      为了提高性能,编译器和处理器可能会对指令做重排序。重排序可以分为三种:
      (1)编译器优化的重排序。
      编译器在不改变单线程程序语义的前提下,可以重新安排语句的执行顺序。
      (2)指令级并行的重排序。
      现代处理器采用了指令级并行技术(Instruction-Level Parallelism, ILP)来将多条指令重叠执行。如果不存在数据依赖性,处理器可以改变语句对应机器指令的执行顺序。
      (3)内存系统的重排序。
      由于处理器使用缓存和读/写缓冲区,这使得加载和存储操作看上去可能是在乱序执行。
      本文对Java 并发编程中的理论基础进行了讲解,有些东西在后续的分析中还会做更详细的讨论,如可见性、顺序性等。如果大家能够很好的理解上述内容,相信无论是去理解其他并发编程的文章还是在平时的并发编程的工作中,都能够对大家有很好的帮助。
    千锋西安Java培训分享之编程中的五个特性分析

    热门评论:

      文章信息
      作者:

      千锋西安

      文章来源: 陕西
      时间:2018-02-06 15:38:43
      阅读次数:75
      回复次数:2
      点击回复比:0%
      只看楼主查看全部
      收藏本帖