Wait的问题

Wait是对同步的破坏。

Synchronized保证了代码的互斥执行。但是wait 与notify破坏了这个命题。wait与notify是对synchronized的hacking,是个很危险的代码。看如下:

Synchronized{

  Reada();

  Wait();

  Writea();

 }

Synchronized{

  Reada();

  Writea();

  notify();

}


显然形成更新覆盖。可以看成是事务隔离性READ_UNCOMMITTED(脏读),READ_COMMITTED(不可重复读), REPEATABLE_READ(幻读),SERIALIZABLE(可序列话)中的不可重复读,一下将synchronized的4级隔离降了两级。由此可以引出大量的问题。另一个问题是synchronized-with关系的破坏。wait并不做内存同步,所以这个同步关系一下被丢得九天云外,系统全乱套了。你必须在所有线程处理这个内存可见性问题。所有从wait出来的代码都看不到wait以前的东西。如果所有线程都共享一个变量,那么这个变量就会有N个版本并且所有这些版本都会基于自己的值不停地更新变化,各演各的。最后系统必然失序。 并且这个跟内存模型无关。它是语义上的覆盖。你可以假设这是个IO操作,结果显然有问题。 wait的另一个问题是,它改变了synchronized的语义。比如在一个嵌套锁中调用它,如: Synchronized(a){ Synchronized(b){ a.wait(); }//release b }//release a 如果这个代码多线程就会死锁。想想吧......我隐约记得好像wait不能在嵌套块里面编译

你可能感兴趣的:(Wait的问题)