我爱学Java之Thread中stop(),suspend(),resume()为什么不安全
来源:互联网 发布:高中化学大全软件下载 编辑:程序博客网 时间:2024/05/15 22:50
当调用stop()方法时会发生两件事:
1.即刻停止run()方法中剩余的全部工作,包括在catch或finally语句中,并抛出ThreadDeath异常(通常情况下此异常不需要显示的捕获),因此可能会导致一些清理性的工作的得不到完成,如文件,数据库等的关闭。
2.会立即释放该线程所持有的所有的锁,导致数据得不到同步的处理,出现数据不一致的问题。
举个例子:
public class Main{ public static void main(String [] args) throws Exception{ TestObject testObject = new TestObject(); Thread t1 = new Thread(){ public void run(){ try { testObject.print("1", "2"); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } }; t1.start(); Thread.sleep(1000); t1.stop(); System.out.println("first : " + testObject.getFirst() + " " + "second : " + testObject.getSecond()); }}class TestObject{ private String first = "ja"; private String second = "va"; public synchronized void print(String first, String second) throws Exception{ this.first = first; Thread.sleep(10000); this.second = second; } public String getFirst() { return first; } public void setFirst(String first) { this.first = first; } public String getSecond() { return second; } public void setSecond(String second) { this.second = second; }}
输出:
first : 1 second : va
从上面的程序验证结果来看,stop()确实是不安全的。它的不安全主要是针对于第二点:释放该线程所持有的所有的锁。一般任何进行加锁的代码块,都是为了保护数据的一致性,如果在调用thread.stop()后导致了该线程所持有的所有锁的突然释放,那么被保护数据就有可能呈现不一致性,其他线程在使用这些被破坏的数据时,有可能导致一些很奇怪的应用程序错误。
suspend()和resume()必须要成对出现,否则非常容易发生死锁。
因为suspend方法并不会释放锁,如果使用suspend的目标线程对一个重要的系统资源持有锁,那么没任何线程可以使用这个资源直到要suspend的目标线程被resumed,如果一个线程在resume目标线程之前尝试持有这个重要的系统资源锁再去resume目标线程,这两条线程就相互死锁了,也就冻结线程。
举个例子:
public class Main{ public static void main(String [] args) throws Exception{ TestObject testObject = new TestObject(); Thread t1 = new Thread(){ public void run(){ testObject.print(); } }; t1.setName("A"); t1.start(); Thread.sleep(1000); Thread t2 = new Thread(){ public void run(){ System.out.println("B已启动,但进入不到print方法中"); testObject.print(); } }; t2.setName("B"); t2.start(); }}class TestObject{ public synchronized void print(){ if(Thread.currentThread().getName().equals("A")){ System.out.println("A 线程 独占该资源了"); Thread.currentThread().suspend(); } }}
输出:
A 线程 独占该资源了已启动,但进入不到print方法中
0 0
- 我爱学Java之Thread中stop(),suspend(),resume()为什么不安全
- Java中为什么反对使用Thread.stop, Thread.suspend, Thread.resume and Runtime.runFinalizersOnExit?
- 解析为什么Thread中的stop(), suspend(), resume() 会被Deprecated
- 为什么java线程不推荐调用stop,suspend,resume方法
- Java并发编程系列之六:stop()、resume()和suspend()
- Java并发编程系列之八:stop()、resume()和suspend()
- Java中的线程Thread方法之---suspend()和resume()
- java 线程Thread方法之suspend()和resume()
- Java中的线程Thread方法之suspend()和resume()
- Java中的线程Thread方法之---suspend()和resume()
- java thread的stop,suspend,resume等方法废弃的原因
- java中,为什么弃用stop和suspend方法
- Why Are Thread.stop, Thread.suspend, Thread.resume and Runtime.runFinalizersOnExit Deprecated?
- Why Are Thread.stop, Thread.suspend, Thread.resume and Runtime.runFinalizersOnExit Deprecated?
- Why Are Thread.stop, Thread.suspend, Thread.resume and Runtime.runFinalizersOnExit Deprecated ?
- Why are Thread.stop, Thread.suspend and Thread.resume Deprecated?(源码学习)
- 多线程中不使用的stop(),resume(),destroy(),suspend().原因
- 为什么 Thread.stop和Thread.suspend等被废弃了?
- hdu 4706 Children's Day
- 逻辑的力量
- 六、树和二叉树--(3)已知先序遍历和中序遍历求后序遍历
- Mysql使用注意问题
- Collection(practice)
- 我爱学Java之Thread中stop(),suspend(),resume()为什么不安全
- 80. Remove Duplicates from Sorted Array II
- 草稿
- pull解析
- android客户端和php服务简单交互
- 【Leetcode】:22. Generate Parentheses 问题 in Go语言
- 递归 - 移梵塔
- Xcode : Your session has expired. Please log in
- HDU 1002 A + B Problem II -- java大法好