千锋西安java培训,能给你专业技术知识的才能称为是真正技术求学的殿堂。千锋作为专业java技术培训机构,成就了千千万万学子的IT梦,打造了无数学生的自由梦。经过统计调查,发现学生在学习java时,并发编程总是一个很难掌握的技术点,小编请教了千锋老师,整理了一篇关于并发编程技术性能分析,助攻每一位在java编程路上不断成长的小伙伴。
并发编程是Java程序员很重要的技能之一,也是很难掌握的一种技能。它要求编程者对计算机底层的运作原理有深刻的理解,同时要求编程者逻辑清晰、思维缜密,这样才能写出、安全、可靠的多线程并发程序。
接下来,西安千锋Java培训讲师将从以下五个方面进行分析:
一、共享性
数据共享性是线程安全的主要原因之一。如果所有的数据只是在线程内有效,那就不存在线程安全性问题,这也是我们在编程的时候经常不需要考虑线程安全的主要原因之一。
但是,在多线程编程中,数据共享是不可避免的。一个典型的场景就是数据库中的数据,为了确保数据的一致性,我们通常需要共享同一个数据库中数据,即使是在主从的情况下,访问的也同一份数据,主从只是为了访问的效率和数据安全,而对同一份数据做的副本。
二、互斥性
资源互斥是指同时只允许一个访问者对其进行访问,具有唯一性和排它性。我们通常允许多个线程同时对数据进行读操作,但同一时间内只允许一个线程对数据进行写操作。所以我们通常将锁分为共享锁和排它锁,也叫做读锁和写锁。如果资源不具有互斥性,即使是共享资源,我们也不需要担心线程安全。
三、原子性
原子性就是指对数据的操作是一个独立的、不可分割的整体。换句话说,就是一次操作,是一个连续不可中断的过程,数据不会执行的一半的时候被其他线程所修改。
确保原子性的一个简单的方式就是操作系统指令,就是说如果一次操作对应一条操作系统指令,这样肯定可以能确保原子性。但是很多操作不能经过一条指令就完成。
四、可见性
要理解可见性,需要先对JVM的内存模型有一定的了解,JVM的内存模型与操作系统类似,如图所示:
从这个图中我们可以看出,每个线程都有一个自己的工作内存(相当于CPU缓冲区,这么做的目的还是在于进一步缩小存储系统与CPU之间速度的差异,提高性能),对于共享变量,线程每次读取的是工作内存中共享变量的副本,写入的时候也直接修改工作内存中副本的值,然后在某个时间点上再将工作内存与主内存中的值进行同步。
这样导致的问题是,如果线程1对某个变量进行了修改,线程2却有可能看不到线程1对共享变量所做的修改。
五、顺序性
为了提高性能,编译器和处理器可能会对指令做重排序。重排序可以分为三种:
(1)编译器优化的重排序。
编译器在不改变单线程程序语义的前提下,可以重新安排语句的执行顺序。
(2)指令级并行的重排序。
现代处理器采用了指令级并行技术(Instruction-Level Parallelism, ILP)来将多条指令重叠执行。如果不存在数据依赖性,处理器可以改变语句对应机器指令的执行顺序。
(3)内存系统的重排序。
由于处理器使用缓存和读/写缓冲区,这使得加载和存储操作看上去可能是在乱序执行。
本文对Java 并发编程中的理论基础进行了讲解,有些东西在后续的分析中还会做详细的讨论,如可见性、顺序性等。如果大家能够很好的理解上述内容,相信无论是去理解其他并发编程的文章还是在平时的并发编程的工作中,都能够对大家有很好的帮助。
上一篇:千锋2018年1月求职信息新鲜出炉:共712人 月薪过万268名
下一篇:在千锋西安学习python用于开发什么呢
入职一年多崔志波工作非常好,感谢千锋培养的人才。
周红梅,有较强的学习能力,是有发展潜力的年轻人。
郑秋浩思想灵活,能按时保质保量完成工作内容。
了解千锋动态
关注千锋教育服务号
扫码关注千锋互联
身边的移动开发导师