zoukankan      html  css  js  c++  java
  • synchronized初识

    作用域:

    1、对象实例内--->People jack = new Jack();

      ①此作用域内的synchronized锁 ,可以防止多个线程同时访问这个对象的synchronized方法

      ②并且一个对象有多个synchronized方法,只要一个线程访问了其中的一个synchronized方法,其它线程不能同时访问这个对象中任何一个synchronized方法

      ③此外,不同对象实例的synchronized方法是不相干预的。也就是说,其它线程可以同时访问此类下的另一个对象实例中的synchronized方法

    示例:

    2、类--->People jack = new Jack();

      ①此作用域下,可以防止多个线程同时访问这个类中的synchronized方法。也就是说此种修饰,可以对此类的所有对象实例起作用

    示例:

     

    synchronized锁的宏观实现

    synchronized的对象锁,其指针指向的是一个monitor对象(由C++实现)的起始地址。每个对象实例都会有一个 monitor。其中monitor可以与对象一起创建、销毁;亦或者当线程试图获取对象锁时自动生成

    monitor是由ObjectMonitor实现(ObjectMonitor.hpp文件,C++实现的)

    可以写一个简单的锁的demo,然后看下他们的字节码就会发现monitor的身影

    ObjectMonitor() {
        _count = 0;
        _owner = NULL;
        _WaitSet = NULL;
        _WaitSetLock = 0;
        _EntryList = NULL;
    }

    ①先看一下_owner,它指向持有ObjectMonitor对象的线程。当多个线程同时访问一段同步代码时,会先存放到 _EntryList 集合中,接下来当线程获取到对象的monitor时,就会把_owner变量设置为当前线程。同时count变量+1。如果线程调用wait() 方法,就会释放当前持有的monitor,那么_owner变量就会被置为null,同时_count减1,并且该线程进入 WaitSet集合中,等待下一次被唤醒。

    ②若当前线程顺利执行完方法,也将释放monitor,重走一遍刚才的内容,也就是_owner变量就会被置为null,同时_count减1,并且该线程进入 WaitSet集合中,等待下一次被唤醒。

    细节请见:https://baijiahao.baidu.com/s?id=1612142459503895416&wfr=spider&for=pc

  • 相关阅读:
    7多态与异常处理的课上作业
    软工概论第十五周总结
    构建之法阅读笔记之三
    小组项目冲刺第六天的个人总结
    书店促销
    小组项目冲刺第五天的个人总结
    找水王
    软工概论第十四周总结
    动态规划——买书问题
    小组项目冲刺第四天的个人总结
  • 原文地址:https://www.cnblogs.com/liuye007/p/10530781.html
Copyright © 2011-2022 走看看