2022年Java同步异步相关知识点.docx
《2022年Java同步异步相关知识点.docx》由会员分享,可在线阅读,更多相关《2022年Java同步异步相关知识点.docx(20页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、名师归纳总结 精品学习资料 - - - - - - - - - - - - - - -学习必备 欢迎下载Java 同步、异步相关学问点关键字 : java 同步、异步相关学问点一、关键字:thread (线程)、 thread-safe 线程安全 、intercurrent(并发的)synchronized 同步的 、asynchronized 异步的 、volatile(易变的)、atomic (原子的)、share (共享)二、总结背景:一次读写共享文件编写,嚯,好家伙,竟然揪出这些零碎而又是一路的学问点;于是乎,Google和翻阅了 Java 参考大全、Effective Java Se
2、cond Edition 学习参考;三、概念:1、什么时候必需同步?什么叫同步?如何同步?,特此总结一下供日后工作要跨线程保护正确的可见性,只要在几个线程之间共享非 final 变量,就必需使用synchronized(或 volatile)以确保一个线程可以观察另一个线程做的更换;为了在线程之间进行牢靠的通信,也为了互斥拜访, 同步是必需的; 这归因于 java 语言规范的内存模型,它规定了:一个线程所做的变化何时以及如何变成对其它线程可见;由于多线程将异步行为引进程序,所以在需要同步时,必需有一种方法强制进行;例如:如果 2 个线程想要通信并且要共享一个复杂的数据结构,如链表, 此时需要确
3、保它们互不冲突,也就是必需阻挡B 线程在 A 线程读数据的过程中向链表里面写数据(A获得了锁, B 必需等 A释放了该锁) ;为了达到这个目的,java在一个旧的的进程同步模型监控器(Monitor )的基础上实现了一个奇妙的方案:监控器是一个掌握机制,可以认为是一个很小的、只能容纳一个线程的 盒子,一旦一个线程进入监控器,其它的线程必需等待,直到那个线程退出监控为止;通过 这种方式,一个监控器可以保证共享资源在同一时刻只可被一个线程使用;这种方式称之为 同步;(一旦一个线程进入一个实例的任何同步方法,别的线程将不能进入该同一实例的其它 同步方法,但是该实例的非同步方法仍旧能够被调用);错误的
4、懂得:同步嘛,就是几个线程可以同时进行拜访;同步和多线程关系:没多线程环境就不需要同步; 有多线程环境也不肯定需要同步;锁供应了两种主要特性:互斥(mutual exclusion) 和可见性( visibility); 第 1 页,共 12 页 细心整理归纳 精选学习资料 - - - - - - - - - - - - - - - - - - - - - - - - 名师归纳总结 精品学习资料 - - - - - - - - - - - - - - -学习必备 欢迎下载互斥即一次只答应一个线程持有某个特定的锁,因此可使用该特性实现对共享数据的和谐访 问协议,这样,一次就只有一个线程能够使用该
5、共享数据;可见性要更加复杂一些,它必需确保释放锁之前对共享数据做出的更换对于随后获得该锁的 另一个线程是可见的 假如没有同步机制供应的这种可见性保证,线程看到的共享变量 可能是修改前的值或不一样的值,这将引发很多严峻问题小结:为了防止多个线程并发对同一数据的修改,所以需要同步, 否就会造成数据不一样(就 是所谓的:线程安全;如 java 集合框架中 Hashtable 和 Vector 是线程安全的;我们的大部 分程序都不是线程安全的,由于没有进行同步,而且我们没有必要,由于大部分情形根本没 有多线程环境) ;2、什么叫原子的(原子操作)? Java原子操作是指:不会被打断地的操作;(就是做到
6、互斥和可见性?!)那莫非原子操作就可以真的达到线程安全同步成效了吗?实际上有一些原子操作不肯定是线 程安全的;那么, 原子操作在什么情形下不是线程安全的呢?或许是这个缘由导致的:java 线程答应线 程在自己的内存区储存变量的副本;答应线程使用本地的私有拷贝进行工作而非每次都使用主存的值是为了提高性能(本人愚见: 虽然原子操作是线程安全的,可各线程在得到变量(读操作)后,就是各自玩弄自己的副本了,更新操作(写操作)因未写入主存中,导致其它线 程不行见);那该如何解决呢?因此需要通过 java 同步机制;在 java 中,32 位或者更少位数的赋值是原子的;在一个 32 位的硬件平台上, 除了
7、double和 long 型的其它原始类型通常都是使用 32 位进行表示, 而 double 和 long 通常使用 64 位表示;另外,对象引用使用本机指针实现,通常也是 32 位的;对这些 32 位的类型的操作是原子的;这些原始类型通常使用 32 位或者 64 位表示, 这又引入了另一个小小的神话:原始类型的大小是由语言保证的;这是不对的; java 语言保证的是原始类型的表数范畴而非 JVM中的储备大小;因此,int 型总是有相同的表数范畴;在一个 JVM上可能使用 32 位实现,而在另一个 JVM上可能是 64 位的;在此再次强调:在全部平台上被保证的是表数范畴,32 位以及更小的值的
8、操作是原子的;3、不要搞混了:同步、异步细心整理归纳 精选学习资料 - - - - - - - - - - - - - - - 第 2 页,共 12 页 - - - - - - - - - 名师归纳总结 精品学习资料 - - - - - - - - - - - - - - -学习必备 欢迎下载举个例子:一般 B/S 模式(同步) AJAX技术(异步)同步:提交恳求- 等待服务器处理- 处理完返回 这个期间客户端浏览器不能干任何事异步:恳求通过大事触发- 服务器处理(这是浏览器仍旧可以作其他事情)- 处理完毕可见,彼“ 同步” 非此“ 同步” 我们说的 java 中的那个共享数据同步(synch
9、ronized)一个同步的对象是指行为(动作),一个是同步的对象是指物质(共享数据);4、 Java 同步机制有 4 种实现方式: (部分引用网上资源) ThreadLocal synchronized wait 与 notify volatile 目的:都是为明白决多线程中的对同一变量的拜访冲突ThreadLocal ThreadLocal 保证不同线程拥有不同实例,相同线程肯定拥有相同的实例,即为每一个使用该变量的线程供应一个该变量值的副本,每一个线程都可以独立转变自己的副本,而不是与其它线程的副本冲突;优势:供应了线程安全的共享对象与其它同步机制的区分:同步机制是为了同步多个线程对相同资
10、源的并发拜访,是为了多个线程之间进行通信;而 ThreadLocal 是隔离多个线程的数据共享,从根本上就不在多个线程之间共享资源,这样当然不需要多个线程进行同步了;volatile volatile 修饰的成员变量在每次被线程拜访时,都强迫从共享内存中重读该成员变量的值;而且,当成员变量发生变化时,强迫线程将变化值回写到共享内存;优势:这样在任何时刻,两个不同的线程总是看到某个成员变量的同一个值;缘由: Java 语言规范中指出,为了获得正确速度,答应线程储存共享成员变量的私有拷贝,而且只当线程进入或者离开同步代码块时才与共享成员变量的原始值对比;这样当多个线程同时与某个对象交互时,就必需要
11、留意到要让线程准时的得到共享成员变量的变化;而volatile 关键字就是提示 VM :对于这个成员变量不能储存它的私有拷贝,而应直接与共享成员变量交互;使用技巧: 在两个或者更多的线程拜访的成员变量上使用 volatile ;当要拜访的变量已在 synchronized 代码块中,或者为常量时,不必使用;线程为了提高效率,将某成员变量 如 A拷贝了一份(如 B),线程中对 A的拜访其实拜访的是 B;只在某些动作时才进行 A 和 B的同步,因此存在 A和 B 不一样的情形; volatile就是用来防止这种情形的; volatile 告知 jvm,它所修饰的变量不保留拷贝,直接拜访主内存中的(
12、读操作多时使用较好;线程间需要通信,本条做不到)细心整理归纳 精选学习资料 - - - - - - - - - - - - - - - 第 3 页,共 12 页 - - - - - - - - - 名师归纳总结 精品学习资料 - - - - - - - - - - - - - - - Volatile 变量具有 synchronized 学习必备欢迎下载的可见性特性,但是不具备原子特性;这就是说线程能够自动发觉 volatile 变量的最新值; Volatile 变量可用于供应线程安全,但是只能应用于特别有限的一组用例:多个变量之间或者某个变量的当前值与修改后值之间没有约束;您只能在有限的一些
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 2022 Java 同步 异步 相关 知识点
限制150内