在讲monitor时候的疑惑
来源:9-2 synchronized底层实现原理
莨菽菽
2020-05-11
从视频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; } }
00 -
翔仔
2020-05-12
同学好,后面讲锁自旋的时候会出现obj区域,OBj就是MArkword,objwaiter就是调用了wait进入等待池的线程
2.monitor就是一种堡垒机制,确实是可以这么理解:),谁先写入是谁的
022020-05-13
相似问题