为什么Thread.stop()方法不安全?

tar*_*lah 0 java concurrency multithreading

引用自"Effective Java book":

"这些库提供了Thread.stop方法,但是这个方法很久以前就被弃用了,因为它本质上是不安全的 - 它的使用会导致数据损坏.不要使用Thread.stop "

谁能告诉我为什么

Dav*_*rtz 8

如果你停止的线程持有一个关键锁怎么办?如果线程将对象置于不一致状态并且还没有机会恢复它,该怎么办?停止线程的正确方法是与其合作,而不是强迫它从外部停止.

而且,它根本没有逻辑意义.应用程序中的所有线程都应该合作以实现相同的目的.如果有不应该做的事情,没有线程应该这样做.应该没有理由停止一个线程 - 它应该只编码做一些事情,如果这是整个应用程序首先需要完成的事情.如果一个线程需要被停止,那只是因为它运行的代码被破坏了 - 即使不应该这样做也要做.只需修复该代码即可.


Jun*_*san 5

来自javadoc:

为什么不推荐使用Thread.stop?

因为它本质上是不安全的.停止线程会导致它解锁已锁定的所有监视器.(当ThreadDeath异常向上传播时,监视器将被解锁.)如果先前受这些监视器保护的任何对象处于不一致状态,则其他线程现在可以以不一致的状态查看这些对象.据说这些物体已被损坏.当线程对受损对象进行操作时,可能会导致任意行为.这种行为可能很微妙并且难以检测,或者可能是明显的.与其他未经检查的异常不同,ThreadDeath会以静默方式杀死线程; 因此,用户没有警告他的程序可能被破坏.腐败可以在实际损害发生后的任何时间显现,甚至在未来几小时或几天.

有关更多信息,请阅读:

http://docs.oracle.com/javase/1.4.2/docs/guide/misc/threadPrimitiveDeprecation.html