日期:2014-05-20  浏览次数:20782 次

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 是在对象上加锁,根本不在乎该对象是个啥。