zoukankan      html  css  js  c++  java
  • Java并发编程的艺术笔记(一)——volatile和syncronized关键字

    一.线程间的通信

    volatile和syncronized关键字

    volatile 修饰变量,告知任何对该变量的访问必须从共享内存获取,对它的改变必须同步刷新至共享内存,由此保证可见性。

    syncronized修饰方法和同步块

    syncronized的实现细节

    写一个java类:

    public class Synchronized {
    public static void main(String[] args) {
    // 对Synchronized Class对象进行加锁
    synchronized (Synchronized.class) {
    }
    // 静态同步方法,对Synchronized Class对象进行加锁
    m();
    }
    public static synchronized void m() {
    }
    }

    class文件的同级目录执行 javap –v Synchronized.class,部分相关输出:

    public static void main(java.lang.String[]);
    // 方法修饰符,表示:public staticflags: ACC_PUBLIC, ACC_STATIC
    Code:
    stack=2, locals=1, args_size=1
    0: ldc #1  // class com/murdock/books/multithread/book/Synchronized
    2: dup
    3: monitorenter  // monitorenter:监视器进入,获取锁
    4: monitorexit  // monitorexit:监视器退出,释放锁
    5: invokestatic  #16 // Method m:()V
    8: return
    public static synchronized void m();
    // 方法修饰符,表示: public static synchronized
    flags: ACC_PUBLIC, ACC_STATIC, ACC_SYNCHRONIZED
    Code:
    stack=0, locals=0, args_size=0
    0: return

     对于同步块使用 monitorentermonitorexit

     对于同步方法则依靠方法修饰符上的ACC_SYNCHRONIZED实现的

    由此看出,任意一个对象都拥有自己的监视器,当这个对象由同步块或者这个对象的同步方法调用时,执行方法的线程必须先获取到该对象的监视器才能进入同步块或者同步方法,而没有获取到监视器(执行该方法)的线程将会被阻塞在同步块和同步方法的入口处,进入同步队列,进入BLOCKED状态。

    下图描述了对象、监视器、同步队列和执行线程的关系:

     

  • 相关阅读:
    IOS技能点之Foundation之NSString
    JavaScript学习笔记 -- ES6学习(二) let 和const
    JavaScript 学习笔记-- ES6学习(一)介绍以及Babel的使用
    JavaScript 学习笔记: 扩充类型的功能
    PHP学习笔记(八)
    PHP学习笔记(六)
    Less 官方文档学习笔记
    PHP学习笔记(五)
    PHP 学习笔记 (四)
    PHP 学习笔记 (三)
  • 原文地址:https://www.cnblogs.com/lingluo2017/p/10232366.html
Copyright © 2011-2022 走看看