Java同步与异步详解教程

一、关键字: 

thread(线程)、thread-safe(线程安全)intercurrent(并发的) synchronized(同步的)asynchronized(异步的)、 volatile(易变的)、atomic(原子的)、share(共享) 


二、概念: 

1、 什么时候必须同步?什么叫同步?如何同步? 

       要跨线程维护正确的可见性,只要在几个线程之间共享非 final 变量,就必须使用 synchronized(或 volatile)以确保一个线程可以看见另一个线程做的更改。 

为了在线程之间进行可靠的通信,也为了互斥访问,同步是必须的。这归因于java语言规范的内存模型,它规定了:一个线程所做的变化何时以及如何变成对其它线程可见。 

因为多线程将异步行为引进程序,所以在需要同步时,必须有一种方法强制进行。例如:如果2个线程想要通信并且要共享一个复杂的数据结构,如链表,此时需要确保它们互不冲突,也就是必须阻止B线程在A线程读数据的过程中向链表里面写数据(A获得了锁,B必须等A释放了该锁)。 

为了达到这个目的,java在一个旧的的进程同步模型——监控器(Monitor)的基础上实现了一个巧妙的方案:监控器是一个控制机制,可以认为是一个很小的、只能容纳一个线程的盒子,一旦一个线程进入监控器,其它的线程必须等待,直到那个线程退出监控为止。通过这种方式,一个监控器可以保证共享资源在同一时刻只可被一个线程使用。这种方式称之为同步。(一旦一个线程进入一个实例的任何同步方法,别的线程将不能进入该同一实例的其它同步方法,但是该实例的非同步方法仍然能够被调用)。 

错误的理解:同步嘛,就是几个线程可以同时进行访问。 

同步和多线程关系:没多线程环境就不需要同步;有多线程环境也不一定需要同步。 

锁提供了两种主要特性:互斥(mutual exclusion) 和可见性(visibility)。 

互斥即一次只允许一个线程持有某个特定的锁,因此可使用该特性实现对共享数据的协调访问协议,这样,一次就只有一个线程能够使用该共享数据。 

可见性要更加复杂一

“Java同步与异步详解教程”的2个回复

发表评论

电子邮件地址不会被公开。 必填项已用*标注

1 × 5 =

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据