zoukankan      html  css  js  c++  java
  • synchronized-粗略过程

    JVM书400页中介绍到在HotSpot虚拟机,每个对象的对象头信息中的“Mark Word”含有锁标志位。当对象被synchronized修饰时标志位为10即重量级锁。

    在具体的过程中,每个对象都对应一个ObjectMonitor,获得锁即获得ObjectMonitor对象。(一切皆对象)

    ObjectMonitor中有两个队列,_WaitSet 和 _EntryList,还有指向持有ObjectMonitor对象的线程的对象_owner。

    当多个线程同时访问一段同步代码时,线程会被封装成ObjectWaiter对象,并进入 _EntryList 集合。

    当线程获取到对象的 monitor 后进入 _Owner 区域并把monitor中的owner变量设置为当前线程,同时monitor中的计数器count加1。

    若线程调用 wait() 方法,将释放当前持有的monitor,owner变量恢复为null,count自减1,同时该线程进入  _WaitSet 集合中等待被唤醒。

    若当前线程执行完毕也将释放monitor(锁)并复位变量的值,以便其他线程进入获取monitor(锁)。

    当线程执行wait()方法时候,会释放当前的锁,然后让出CPU,进入等待状态。
    只有当 notify/notifyAll() 被执行时候,才会唤醒一个或多个正处于等待状态的线程,然后继续往下执行,直到执行完 synchronized 代码块的代码或是中途遇到wait() ,再次释放锁。

    参考:https://blog.csdn.net/javazejian/article/details/72828483

    我好菜呀
  • 相关阅读:
    Cookie、Session和自定义分页
    logstash 运行
    php json数据保留原样中文
    linux 32位还是64位
    php之isset 与 empty 区别
    php 订单
    个人分类
    laravel 创建自己的函数
    lumen框架导入数据异常
    yum安装samba服务器的安装
  • 原文地址:https://www.cnblogs.com/LinsenLi/p/9759828.html
Copyright © 2011-2022 走看看