请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

在讲monitor时候的疑惑

https://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,有点类似请求头一样的东西么?




正在回答 回答被采纳积分+3

2回答

翔仔 2020-05-13 21:09:44

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 回复 有任何疑惑可以回复我~
翔仔 2020-05-12 11:33:31

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

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

0 回复 有任何疑惑可以回复我~
  • 提问者 莨菽菽 #1
    老师好,你原话说把线程封装成objwaiter,这个objwaiter比线程多了些什么呢?还有一个问题是,原话是说:“当多个线程同时访问同一段同步代码的时候,首先会进入到entryList,当线程获取到对象的monitor后,就进入到Obj区域”,是不是理解为线程先通过内核态获取了monitor,然后进入了obj区域就是进入到堆里面去获取对象的markword对吧?
    回复 有任何疑惑可以回复我~ 2020-05-12 23:48:43
  • 翔仔 回复 提问者 莨菽菽 #2
    同学好,不是获取对象的markword,而是能修改markword的信息为自己的信息。
    回复 有任何疑惑可以回复我~ 2020-05-13 21:09:18
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信