在讲monitor时候的疑惑

来源:9-2 synchronized底层实现原理

莨菽菽

2020-05-11

http://img1.sycdn.imooc.com/szimg/5eb965da09c90f8706330343.jpg

从视频3:40s开始,老师的原话是这样:

有两个队列,waitSet(等待池),EntryList(锁池),用来保存objWaiter的对象列表,每个对象锁的线程都会被封装成objWaiter来保存到里面

owner:指向持有objMonitor对象的线程,当多个线程同时访问同一段同步代码的时候,首先会进入到entryList,当线程获取到对象的monitor后,就进入到Obj区域,并把monitor中的owner变量设置为当前线程,同时monitor中的计数器count+1,若线程调用wait(),就释放当前持有的monitor,owner被恢复成null,count-1,然后该线程即是objwaiter实例就会进入到waitSet集合中等待被唤醒;若当前线程执行完毕,它也将释放monitor锁,并复位对应变量的值以便其他线程进入获取monitor锁


问题是:

1.这个objWaiter和Obj区域具体是指什么,之前好像没有讲过吧?

2.是不是可以理解为平时抢的对象锁就是抢monitor,有点类似请求头一样的东西么?




写回答

2回答

翔仔

2020-05-13

objwaiter长这样

static final class Node {
        static final Node SHARED = new Node();
        static final Node EXCLUSIVE = null;
        static final int CANCELLED =  1;
        static final int SIGNAL    = -1;
        static final int CONDITION = -2;
        static final int PROPAGATE = -3;
        volatile int waitStatus;
        volatile Node prev;
        volatile Node next;
        volatile Thread thread;
        Node nextWaiter;
        Node() {    // Used to establish initial head or SHARED marker
        }
        Node(Thread thread, Node mode) {     // Used by addWaiter
            this.nextWaiter = mode;
            this.thread = thread;
        }
        Node(Thread thread, int waitStatus) { // Used by Condition
            this.waitStatus = waitStatus;
            this.thread = thread;
        }
    }


0
0

翔仔

2020-05-12

同学好,后面讲锁自旋的时候会出现obj区域,OBj就是MArkword,objwaiter就是调用了wait进入等待池的线程

2.monitor就是一种堡垒机制,确实是可以这么理解:),谁先写入是谁的

0
2
翔仔
回复
莨菽菽
同学好,不是获取对象的markword,而是能修改markword的信息为自己的信息。
2020-05-13
共2条回复

剑指Java面试-Offer直通车 百度资深面试官授课

招聘季即将到来,让百度资深面试官来为你的高薪Offer保驾护航

8427 学习 · 1870 问题

查看课程