`
逆风的香1314
  • 浏览: 1453246 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

为什么Thread.stop会过期?一段引起同步异常问题的代码样例

阅读更多
http://www.java2000.net/p11400
先看一段stop引起同步异常的代码。
  1. package thread;

  2. /**
  3.  * Thread.stop引起同步异常问题的代码样例。<br>
  4.  * 所以过期且不推荐使用。他会造成数据的不一致问题,引起垃圾数据。
  5.  * 
  6.  * @author Administrator
  7.  * 
  8.  */
  9. public class ThreadStopTest {
  10.   private static Object lock = new Object();
  11.   private static int number = 0;
  12.   private static String name = "Name0";

  13.   public static void main(String[] args) {
  14.     ThreadStop t = new ThreadStop();
  15.     t.start();
  16.     ThreadRun t2 = new ThreadRun();
  17.     t2.start();
  18.     // 输出为
  19.     // number=1
  20.     // name=Name0,
  21.     // 如果去掉stop,则输出正常为
  22.     // nunber=1
  23.     // name=Name11
  24.     t.stop();
  25.   }

  26.   static class ThreadRun extends Thread {
  27.     public void run() {
  28.       synchronized (lock) {
  29.         try {
  30.           Thread.sleep(100);
  31.         } catch (InterruptedException e) {
  32.           e.printStackTrace();
  33.         }
  34.         System.out.println("number=" + number);
  35.         System.out.println("name=" + name);
  36.       }
  37.     }
  38.   }

  39.   static class ThreadStop extends Thread {
  40.     public void run() {
  41.       synchronized (lock) {
  42.         number++;
  43.         try {
  44.           Thread.sleep(50);
  45.         } catch (InterruptedException e) {
  46.           e.printStackTrace();
  47.         }
  48.         name = "Name" + number;
  49.       }

  50.     }
  51.   }
  52. }


Why is Thread.stop deprecated?
为什么Thread.stop会过期?

Because it is inherently unsafe. Stopping a thread causes it to unlock all the monitors that it has locked. (The monitors are unlocked as the ThreadDeath exception propagates up the stack.) If any of the objects previously protected by these monitors were in an inconsistent state, other threads may now view these objects in an inconsistent state. Such objects are said to be damaged. When threads operate on damaged objects, arbitrary behavior can result. This behavior may be subtle and difficult to detect, or it may be pronounced. Unlike other unchecked exceptions, ThreadDeath kills threads silently; thus, the user has no warning that his program may be corrupted. The corruption can manifest itself at any time after the actual damage occurs, even hours or days in the future.

因为它本身就是不安全的。停止一个线程引起它释放了它所有的锁的监控。 (死亡线程的被锁的监控上的异常在堆栈传播)。如有任何以前被这些所锁保护的对象将处于不一致的状态,其他线程现在可以看到不一致的状态。这类对象可以认 定是被破坏的。当线程操作被破坏的对象时,可能引发任何结果。此现象可能是微妙和难以察觉,也可以显着。不同于其他为检查的例外, ThreadDeath悄悄地杀死线程,因此,用户没有收到任何警告,他的程序可能会损坏。问题可以出现在任何时间后,实际损害发生,甚至在数小时或数天以后。

分享到:
评论

相关推荐

    为什么不鼓励使用 Thread.stop?

    标题 "为什么不鼓励使用 Thread.stop" 涉及到的是Java多线程编程中的一个重要话题,主要探讨了为何在实际开发中不建议直接使用 `Thread.stop` 方法来终止一个线程的执行。 在Java中,`Thread.stop` 被设计为停止一...

    Java线程及同步(synchronized)样例代码

    ### Java线程及同步(synchronized)样例代码解析 #### 一、概述 本篇文章主要分析一个关于Java线程及其同步机制(synchronized)的示例代码。该示例展示了如何在多线程环境中使用`synchronized`关键字来实现线程...

    qtThread-1.rar qt线程学习代码样例,继承线程方式

    在提供的代码样例"qtThread_1"中,我们可以期待看到如何设置和管理这些线程,包括如何传递参数、如何同步线程以及如何处理可能的错误和异常。此外,可能还会涉及到线程池的概念,通过QThreadPool来管理和复用线程,...

    C#多线程之Thread中Thread.IsAlive属性用法分析

    使用`Thread.IsAlive`属性时,应当注意线程同步和竞态条件问题,尤其是在多线程环境下。线程状态的检查和修改应配合其他同步机制,如`Mutex`, `Semaphore`, `Monitor`或`lock`关键字,以防止数据竞争和死锁的发生。...

    https客户端、服务端代码样例

    以下是一个简单的服务端代码样例(Servers.java): ```java import javax.net.ssl.*; import java.io.*; import java.net.ServerSocket; import java.net.Socket; public class Servers { public static void ...

    qtThread-2.rar qt 线程练习样例代码,继承Qobject方式

    在Qt框架中,线程(Thread)是...总的来说,"qtThread-2.rar"中的样例代码为学习和实践Qt多线程编程提供了一个基础模板。通过深入研究和修改这个例子,你可以更好地理解和掌握Qt中线程的使用,提升你的软件开发能力。

    安卓样例程序

    【安卓样例程序】是专为安卓初学者设计的一系列示例代码,旨在帮助开发者入门安卓应用开发。这些示例程序通常涵盖了安卓平台的各种基本功能和常见操作,为学习者提供了一个直观、实践性强的学习环境。 在安卓应用...

    Android应用源码之拍照上传代码样例(转-IT计算机-毕业设计.zip

    在这个代码样例中,可能使用了Intent方式,通过创建一个`Intent`,设置其动作为`ACTION_IMAGE_CAPTURE`,然后用`startActivityForResult()`启动相机应用。拍摄完成后,相机应用会返回结果到指定的`onActivityResult...

    高性能计算cuda样例代码及库文件.7z

    《CUDA高性能计算实践:样例代码与库文件解析》 CUDA(Compute Unified Device Architecture)是NVIDIA公司推出的一种并行计算平台和编程模型,旨在利用GPU(图形处理器)的强大计算能力,实现高性能计算。CUDA技术...

    C#多线程70样例源代码

    通过设置`Thread.IsBackground`属性,可以将线程标记为后台线程。当所有前台线程结束时,即使还有后台线程运行,进程也会终止。 十、线程安全的集合 .NET Framework提供了一些线程安全的集合类,如`...

    java解惑--异常地危险

    这个方法通过调用 `Thread.stop()` 方法来抛出异常,这不仅绕过了正常的异常处理流程,而且由于 `Thread.stop()` 已经被标记为废弃,这种做法也违反了最佳实践。 #### 安全替代方案 虽然直接使用 `Thread.stop()` ...

    Thread捕捉异常示例

    另外,`Thread.sleep()`和`synchronized`块等同步操作也可能抛出异常,如`InterruptedException`。在编写多线程代码时,需要注意这些潜在的异常源,并适当处理。 总结来说,"Thread捕捉异常示例"主要涉及了在Java多...

    Android中利用App实现消息推送机制的代码样例

    本篇文章将探讨如何在Android中实现这样的消息推送机制,并给出具体的代码样例。 首先,消息推送机制的核心是服务器端的主动通知。传统的交互方式是客户端请求服务器,而消息推送则是服务器主动将信息推送到客户端...

    线程外部挂起恢复控制(不使用Suspend与Resume中止线程)

    本人利用Thread.Abort()与Thread.Interrupt()可以引起目标线程异常的特点,开发了一种不使用已过时的方法来变相从外部控制线程的挂起与恢复的技术,原理简单,方便理解。 相关技术参考:...

    【IT十八掌徐培成】Java基础第08天-03.多线程-同步代码块-同步方法.zip

    同步代码块是通过`synchronized`关键字包裹一段代码,确保同一时间只有一个线程可以执行这段代码。其语法格式如下: ```java synchronized (object) { // 需要同步的代码 } ``` 这里的`object`是监视器对象,它...

    Concurrent.Thread.js javascript多线程

    Concurrent.Thread.js 一个用来让javascript也进行多线程开发的包,感兴趣的快来下吧。

    由 TypeInitializationException 引起的问题

    为什么会出现这种问题呢?这是因为 TypeInitializationException 异常是由静态构造函数引起的。在多线程环境中,当一个线程终止时,其他线程可能还在使用该类型的静态成员变量,从而导致 ...

    Java多线程-同步机制解决线程安全问题方式一:同步代码块

    为了解决这个问题,Java提供了同步机制,其中一种常用的方式就是同步代码块(synchronized block)。 一、同步机制介绍 同步机制的核心在于控制对共享资源的访问,确保在同一时刻只有一个线程能够执行特定的代码...

    使用互斥进行线程同步代码示例 Thread3_23.zip_互斥_线程同步

    临界区是指一段必须被互斥访问的代码,任何时刻只有一个线程能执行临界区内的代码。临界区的实现通常依赖于互斥锁或其他同步原语。在多线程环境中,通过在进入和退出临界区时获取和释放锁,可以确保线程安全地访问...

    Java同步与异步[定义].pdf

    Java 同步与异步是一种编程技术,旨在解决多线程环境下的数据一致性和可见性问题。下面是 Java 同步与异步的定义和概念: 关键字: * thread(线程):Java 中的基本执行单元,能够独立执行一系列任务。 * thread...

Global site tag (gtag.js) - Google Analytics