美文网首页
java管程sychronized

java管程sychronized

作者: leo小超 | 来源:发表于2019-05-10 23:38 被阅读0次

通过sychronized给对象加锁,每个对象在实例化后,会同时实例出一个ObjectMoniter,同时对象有对象头(markOop
),在对象头中会存有当前锁状态信息,包含线程id。
ObjectMoniter
objectMonitor.hpp

ObjectMonitor() {
    _header       = NULL;
    _count        = 0;
    _waiters      = 0,
    _recursions   = 0;
    _object       = NULL;
    _owner        = NULL;
    _WaitSet      = NULL;
    _WaitSetLock  = 0 ;
    _Responsible  = NULL ;
    _succ         = NULL ;
    _cxq          = NULL ;
    FreeNext      = NULL ;
    _EntryList    = NULL ;
    _SpinFreq     = 0 ;
    _SpinClock    = 0 ;
    OwnerIsThread = 0 ;
    _previous_owner_tid = 0;
  }

_count:当有对象获取锁,count+1,对象释放锁count-1
_EntryList:当有对象尝试获取锁,加入entryList中
_WaitSet:当调用wait方法,进入等待队列
_owner:拥有锁当线程,当锁释放是,count-1同时owner置为NULL
当使用sychronized给对象加锁时,字节码中是monitorenter给指定对象加锁,给静态方法加锁时,使用ACC_SYNCHRONIZED标志给当前对象加锁。

public class SychronizedTest {

    private final Object lock = new Object();

    private volatile int count;

    public synchronized void method1() {
        count++;
    }

    public void method2() {
        synchronized (lock) {
            count++;
        }
    }
}

bytecode

public synchronized void method1();
    descriptor: ()V
    flags: ACC_PUBLIC, ACC_SYNCHRONIZED
    Code:
      stack=3, locals=1, args_size=1
         0: aload_0
         1: dup
         2: getfield      #4                  // Field count:I
         5: iconst_1
         6: iadd
         7: putfield      #4                  // Field count:I
        10: return
      LineNumberTable:
        line 14: 0
        line 15: 10
      LocalVariableTable:
        Start  Length  Slot  Name   Signature
            0      11     0  this   Lcom/chao/SychronizedTest;

public void method2();
    descriptor: ()V
    flags: ACC_PUBLIC
    Code:
      stack=3, locals=3, args_size=1
         0: aload_0
         1: getfield      #3                  // Field lock:Ljava/lang/Object;
         4: dup
         5: astore_1
         6: monitorenter
         7: aload_0
         8: dup
         9: getfield      #4                  // Field count:I
        12: iconst_1
        13: iadd
        14: putfield      #4                  // Field count:I
        17: aload_1
        18: monitorexit
        19: goto          27
        22: astore_2
        23: aload_1
        24: monitorexit
        25: aload_2
        26: athrow
        27: return
      Exception table:
         from    to  target type
             7    19    22   any
            22    25    22   any
      LineNumberTable:
........

相关文章

  • java管程sychronized

    通过sychronized给对象加锁,每个对象在实例化后,会同时实例出一个ObjectMoniter,同时对象有对...

  • Java Concurrent synchronized 使用&

    sychronized 用法 sychronized 是Java语法层面的同步策略,可以用来修饰instance变...

  • ReentrantLock原理剖析

    引言 提起java的线程同步,大家总能想到sychronized关键字。sychronized是由JVM提供的重量...

  • Sychronized in Java

    使用多线程,避免不了要考虑线程安全的问题,常见解决线程安全的方式:是采用“序列化访问临界资源”的方案。即在同一时刻...

  • 管程概念

    什么是管程 Java采用的是管程技术,synchronized关键字及wait()、notify()、notify...

  • Java管程

    管程主要为了解决并发领域的两大核心问题:互斥和同步互斥:在同一时刻只允许一个线程访问共享资源同步:线程之间如何通信...

  • 谈谈 java线程同步机制--标准答案

    一 java线程同步原理 java中的同步使用到了 Monitor(管程)机制java会为每个object对象分配...

  • Java中的管程模型

    操作系统使用信号量解决并发问题,Java选择使用管程(Monitor)解决并发问题。信号量和管程是等价的,可以使用...

  • Java并发(一)——Sychronized

    并发(currency)中,线程主要通过共享对域的访问实现通信,但是这样的共享,没有问题吗? [TOC] 1. 共...

  • java 锁 sychronized 笔记

    1.引言 最近面试,遇到锁相关的考点,以前学习过可惜忘记了,而且随着工作年限的增长,很多以前搞不懂的,再次理解变得...

网友评论

      本文标题:java管程sychronized

      本文链接:https://www.haomeiwen.com/subject/kzmsoqtx.html