线程中yield()、sleep()、wait()、notify()、stop()、interrupt()、destroy()、suspend()、resume()对锁有何影响?

1.yield()

yield()方法仅仅只是让出cpu的执行权,并不会将锁让出,也就是不会释放锁资源。

2.sleep()

sleep()方法也不会释放当前线程所持有的锁,当我们的线程休眠后,必须等待线程休眠过后,其他(未休眠的)线程才可以拿到锁。

3.wait()

wait()方法被调用后会释放当前线程所持有的锁,当被唤醒的时候会继续去竞争锁。竞争到锁后,才能继续执行下面的业务。

4.notify()

调用notify()方法不会释放锁,只有同步代码块的业务执行完成后才会释放锁,一般该方法放在代码最后一行。

5.stop()

终止线程。弃用方法。调用该方法无论run()中的逻辑是否执行完,都会释放CPU资源,释放锁资源。导致线程不安全。

6. interrupt()

中断线程。线程调用interrupt时,如果该线程正在执行普通的代码,那么该线程根本就不会抛出InterruptedException异常。但是一旦该线程进入到wait、join、sleep后,就立刻抛出该异常。单独调用interrupt()方法不能中断正在运行过程中的线程,只能中断阻塞过程中的线程。

7. destroy()

弃用方法。强制终止线程,但该线程不会释放对象锁。

8. suspend()

暂停线程。弃用方法。执行该方法释放了CPU资源,没有释放锁资源,可能出现死锁。该方法导致线程暂停的同时,并不会去释放任何锁资源。其他线程都无法访问被它占用的锁。直到对应的线程执行resume()方法后,被挂起的线程才能继续,从而其它被阻塞在这个锁的线程才可以继续执行。

9. resume()

重启线程.弃用方法.suspend()和resume()必须要成对出现,否则非常容易发生死锁。不会释放对象锁。

发表回复

后才能评论