假设有class Lock和class Reader,class Writer三个类, Reader和Writer以Lock为锁来进行共享数据的互斥访问.假设Reader和Writer类有如下内容:
class Reader implements Runnable {
  ... ...
  private Thread readerThread;
  public Reader() {
    ... ...
    readerThread=new Thread(this);
  }
  ... ...
  public void start() { readerThread.start(); }
  public void reset() {
    readerThread=null;
    readerThread=new Thread(this);
  }
  ... ...
}
Writer类与此相似. 现在在主程序中分别有三个类的实例:
Lock lock=new Lock();
Reader reader=new Reader();
Writer writer=new Writer();
reader.start();  writer.start();
... ...
    那么,假如在程序执行到某处时有如下语句:
lock=new Lock();  使原先lock指向的对象成为一个无用对象而被释放掉,那么以它为锁的reader和writer里的线程会怎么样? 继续运行下去还是停止?    第二问题: 如果并不把锁对象释放, 而是把两个线程释放,也即在程序某处执行了:  reader.reset();  writer.reset();
那么原先的两个线程是继续运行下去呢还是被停止?

解决方案 »

  1.   

    那就不要看这个例子,简单点说,就是:假如synchronized()中的那个对象被释放(没有引用指向它),那么访问被这个synchronized块保护的共享数据的线程(the thread which access the shared data that protected by this "synchronized" block,这样更清楚一点吧)会怎么样? 当然这可能要分得详细些,就是:若它已经执行进这个synchronized块内部,并因为条件不满足而在这个同步对象(我不知道应该叫什么,就是synchronized()括号中的那个)上wait()的话,这时释放锁对象会如何? 若还没有执行到synchronized(){ ,就释放了同步对象,那么当线程执行到此时又怎样?