java.lang.Shutdown类里的一个问题
问题看红色字体部分
Shutdown类里部分源码抄录:
.....
private static class Lock { };
private static Object lock = new Lock();
.....
static void exit(int status) {
boolean runMoreFinalizers = false;
synchronized (lock) {//lock只是一个内部空类的引用,怎么实现锁定资源的功能,请大牛们解释下过程
if (status != 0) runFinalizersOnExit = false;
switch (state) {
case RUNNING: /* Initiate shutdown */
state = HOOKS;
break;
case HOOKS: /* Stall and halt */
break;
case FINALIZERS:
if (status != 0) {
/* Halt immediately on nonzero status */
halt(status);
} else {
/* Compatibility with old behavior:
* Run more finalizers and then halt
*/
runMoreFinalizers = runFinalizersOnExit;
}
break;
}
}
------解决方案--------------------synchronized 是在对象上加锁,根本不在乎该对象是个啥。
另外你也不能说lock是个“空类”,至少它继承了Object基类的所有内容。
你甚至可以 synchronized(Lock.class){}
------解决方案--------------------这个锁的概念,每一个java对象都可以。而多线程的时候为了保证同步,肯定是要确保几个线程用的是一个锁了。
而这个lock是类的变量,内存中肯定只有一个了,所以拿它做锁没有问题,即使是空也不影响。
------解决方案--------------------你3楼的理解基本正确,但我担心你可能会有两点理解错误,我说明下:
首先,设有:
private static Object lock1 = new Lock();
private static Object lock2 = new Lock();
那么:
synchronized (lock2) {}
synchronized (lock1) {}
synchronized (Lock.class) {}
互不影响。
其次,“谁有lock对象的那把锁,谁才可以执行括号里的那些代码”,不完全正确:
synchronized 本意是“同步”,并非是绝对意义上的“锁”,它强调的是线程访问的互斥性,并非绝对的拒绝另一个线程访问该对象,用wait就可以临时释放当前线程对该对象的占有,并等待被notify所唤醒。
这个可以参见一个例子,这里面就用到了wait去释放锁:
http://blog.csdn.net/ldh911/article/details/7268879
------解决方案--------------------synchronized 是在对象上加锁,根本不在乎该对象是个啥。