【Java并发编程学习】五、synchronized关键字

* Java内存模型是围绕着在并发过程当中如何处理原子性、可见性、和有序性这3个特征来创建的
* 原子性(Atomicity)
*     一、由Java内存模型来直接保证的原子性变量操做包括read、load、assign、use、store和write,
*     大体能够认为基本数据类型的访问读写是具有原子性的(例外就是long和double的非原子性协定)。
*
*     二、Java内存模型还提供了lock和unlock操做来知足这种需求,尽管虚拟机未把lock和unlock操做
*     直接开放给用户使用,可是却提供了更高层次的字节码指令monitorenter和monitorexit来隐式地
*     使用这两个操做,这个两个字节码指令反映到Java代码中就是同步块--synchronized关键字,所以
*     在synchronized块之间的操做也具有原子性。
* 可见性(Visibility)
*
* 有序性(Ordering)
*
*
*  synchronized关键字说明
*  一、互斥同步(Mutual Exclusion & Synchronization)是常见的一种并发正确性保障手段。同步是指在多个线程并发访问共享数据时,
*  保证共享数据在同一个时刻只被一个(或者是一些,使用信号量的时候)线程使用。而互斥是实现同步的一种手段,临界区(Critical Section)、
*  互斥量(Mutex)和信号量(Semaphore)都是主要的互斥实现方式。所以,在这4个字里面,互斥是因,同步是果;互斥是方法,同步是目的。
*
*  二、在Java中,最基本的互斥同步手段就是synchronized关键字,synchronized关键字通过编译以后,会在同步块的先后分别造成monitorenter
*  和monitorexit这两个字节码指令,这两个字节码都须要一个reference类型的参数来指明要锁定和解锁的对象。若是Java程序中的synchronized
*  明确指定了对象参数,那就是这个对象的reference;若是没有明确指定,那就根据synchronized修饰的是实例方法仍是类方法,去取对应的
*  对象实例或Class对象来做为锁对象。
*
*  三、根据虚拟机规范的要求,在执行monitorenter指令时,首先要尝试获取对象的锁。若是这个对象没被锁定,或者当前线程已经拥有了那个对象的
*  锁,把锁的计数器加1,相应的,在执行monitorexit指令时会将锁计数器减1,当计数器为0时,锁就被释放。若是获取对象锁失败,那当前线程就要
*  阻塞等待,直到对象锁被另一个线程释放为止。
*
*  四、synchronized同步块对同一条线程来讲是可重入的,不会出现本身把本身锁死的问题。其次,同步块在已进入的线程执行完以前,会阻塞后面
*  其它线程的进入。
相关文章
相关标签/搜索