JAVA STOP方法的不安全性

java 线程中 stop()和 suspend()方法为何不推荐使用? 用 synchronized 关键字修饰同步方法; 反对使用 stop(),是因为它不安全。它会解除由线程获取的所有锁定,而 且如果对象处于一种不连贯状态,那么其他线程能在那种状态下检查和修改它 们。结果很难检查出真正的问题所在; suspend()方法容易发生死锁。调用 suspend()的时候,目标线程会停下来, 但却仍然持有在这之前获得的锁定。此时,其他任何线程都不能访问锁定的资源 阅读详情
 

@Deprecated
public final void stop()

    已过时。 该方法具有固有的不安全性。用 Thread.stop 来终止线程将释放它已经锁定的所有监视器(作为沿堆栈向上传播的未检查 ThreadDeath 异常的一个自然后果)。如果以前受这些监视器保护的任何对象都处于一种不一致的状态,则损坏的对象将对其他线程可见,这有可能导致任意的行为。stop 的许多使用都应由只修改某些变量以指示目标线程应该停止运行的代码来取代。目标线程应定期检查该变量,并且如果该变量指示它要停止运行,则从其运行方法依次返回。如果目标线程等待很长时间(例如基于一个条件变量),则应使用 interrupt 方法来中断该等待。有关更多信息,请参阅《为何不赞成使用 Thread.stop、Thread.suspend 和 Thread.resume?》。

    强迫线程停止执行。

    如果安装了安全管理器,则以 this 作为其参数调用 checkAccess 方法。这可能引发 SecurityException(在当前线程中)。

    如果该线程不同于当前线程(即当前线程试图终止除它本身以外的某一线程),则安全管理器的 checkPermission 方法(带有 RuntimePermission("stopThread") 参数)也会被调用。这会再次抛出 SecurityException(在当前线程中)。

    无论该线程在做些什么,它所代表的线程都被迫异常停止,并抛出一个新创建的 ThreadDeath 对象,作为异常。

    停止一个尚未启动的线程是允许的。如果最后启动了该线程,它会立即终止。

    应用程序通常不应试图捕获 ThreadDeath,除非它必须执行某些异常的清除操作(注意,抛出 ThreadDeath 将导致 try 语句的 finally 子句在线程正式终止前执行)。如果 catch 子句捕获了一个 ThreadDeath 对象,则重新抛出该对象很重要,因为这样该线程才会真正终止。

    对其他未捕获的异常作出反应的顶级错误处理程序不会打印输出消息,或者另外通知应用程序未捕获到的异常是否为 ThreadDeath 的一个实例。

    抛出:
        SecurityException - 如果当前线程不能修改该线程。
    另请参见:
        interrupt(), checkAccess(), run(), start(), ThreadDeath, ThreadGroup.uncaughtException(java.lang.Thread, java.lang.Throwable), SecurityManager.checkAccess(Thread), SecurityManager.checkPermission(java.security.Permission)

深入探讨Java多线程中的 Thread.stop 方法的不安全性 在Java早期版本中,Thread类提供了stop()方法,该方法可以立即停止线程的执行。然而,这个方法由于其不可预测性和安全性问题,在后续版本中已被标记为过时stop方法的不安全性主要表现在以下几个方面:资源泄露风险:当线程被stop方法强制终止时,可能会导致运行中线程所持有的资源未能得到正确释放。这种资源泄露包括内存、文件句柄、锁等系统资源。数据状态不一致:stop方法的执行可能使得线程未能完成既定任务就终止了,这会导致数据状态不一致,影响程序的正确性和稳定性。不可控的异常。 阅读详情

相关推荐

PHP+txt文件存储简易留言板

留言板共三个文件: index.php---展示留言内容和收集表单 write.php---向txt文件写入数据 message.txt---存储留言数据 index.php用于展示留言内容、通过表单把用户输入的数据POST给write.php,write.php把内容写入message.txt。 index.php代码: <?php //设置时区 date_defau...

仿站、源码搭建/迁移技术博客 1031

我爱学Java之Thread中stop(),suspend(),resume()为什么不安全

当调用stop()方法时会发生两件事:1.即刻停止run()方法中剩余的全部工作,包括在catch或finally语句中,并抛出ThreadDeath异常(通常情况下此异常不需要显示的捕获),因此可能会导致一些清理性的工作的得不到完成,如文件,数据库等的关闭。2.会立即释放该线程所持有的所有的锁,导致数据得不到同步的处理,出现数据不一致的问题。举个例子:public class Main{

JavaSheng的专栏 3434

AI 自动生成商业计划书:AIGC 如何助力创业者?

在创业的早期阶段,商业计划书(Business Plan)是至关重要的。它不仅用于吸引投资者、明确发展路径,还能帮助团队对业务模式、市场定位和财务预测有清晰认知。然而,撰写一份高质量的商业计划书往往需要投入大量时间和精力。如今,AIGC(AI Generated Content,人工智能生成内容)技术正在改变这一现状。借助 AIGC,创业者可以更快速、高效地创建商业计划书,并通过 AI 进行优化和数据分析。

2401_82808034的博客 3781

多线程为什么弃用stop和suspend

初始的java版本中定义了一个stop方法来终止一个线程还定义了一个suspend方法来阻塞一个线程,直到另一个线程调用resume方法。这两个方法在Java SE 1.2之后就被弃用了,因为这两种方法都不安全,下面我们分别来讨论一下为什么不安全和应该怎样做才是安全的。   一、stop方法为什么不安全   其实stop方法天生就不安全,因为它在终止一个线程时会强制中断线程的执行,不管ru...

maxiaoyin111111的博客 930

基于three.js的室内全景3D展馆案例分享

3D场景展厅

acheng 3558

win2012 r2 + IIS8.5 伪静态设置脚本映射

win2012 r2 + IIS8.5 伪静态设置脚本映射,网站用的.net fromwork 2.0 ,应用程序池设置了32位支持

xueking87的专栏 3240

java如何取消安全级别_JAVA STOP方法的不安全性

@Deprecatedpublic final void stop()已过时。 该方法具有固有的不安全性。用 Thread.stop 来终止线程将释放它已经锁定的所有监视器(作为沿堆栈向上传播的未检查 ThreadDeath 异常的一个自然后果)。如果以前受这些监视器保护的任何对象都处于一种不一致的状态,则损坏的对象将对其他线程可见,这有可能导致任意的行为。stop 的许多使用都应由只修改某些变量...

weixin_42591908的博客 394

【华为2021校招】笔试题【通用硬件】

时间:2020/07/15 19:00 时长:60min 题型:40单选+5多选 难度:中等 考察范围:模电、数电、SI、EMC、电源、微机原理、计算机网络、材料

Jkcia的博客 4万+

java stop方法_JAVA STOP方法的不安全性

@Deprecatedpublic final void stop()已过时。 该方法具有固有的不安全性。用 Thread.stop 来终止线程将释放它已经锁定的所有监视器(作为沿堆栈向上传播的未检查 ThreadDeath 异常的一个自然后果)。如果以前受这些监视器保护的任何对象都处于一种不一致的状态,则损坏的对象将对其他线程可见,这有可能导致任意的行为。stop 的许多使用都应由只修改某些变量...

weixin_32060429的博客 649

[FreeRTOS+STM32CubeMX] 03 USART串口调试-基于中断实现接收和发送数据

我们接着上一小节,上一节讲到,接收上位机传来的数据时,需要事先知道传来的数据的字节数,这一操作实在有些反人类,那么如何解决这个问题,上位机输入多少,我们就接收多少数据呢? 接下来我将把USART引入中断,在接收数据的回调函数中引入二值信号量、消息队列,来让我的接收数据能够存储在队列中,并一个一个的在任务中输出出来,并最终在上位机回显。

RichieHuang的博客 2649

ANSYS FLUENT 超临界流体物性分段线性插值数据批量导入

使用fluent自带数据库进行超临界流体仿真时,时不时会出现计算错误,考虑是数据库不稳定引起,而使用自定义的分段线性插值物性则不会出现上述情况。 超临界流体在拟临界点附近物性变化剧烈,需要使用较多的数据点才能更准确的表述物性,如果是在对话框中修改,一次只能输入一个点,人工输入极其费时费力且容易失误。 数据批量导入方法为: 1.以CO2为例,使用REFREPRO等物性查询软件或数据资料,获得所需物性数据表。 2.在FLUENT材料Materia...

wind_rider的博客 1万+

java多线程(八)为什么弃用stop和suspend

初始的java版本中定义了一个stop方法来终止一个线程还定义了一个suspend方法来阻塞一个线程,直到另一个线程调用resume方法。这两个方法在Java SE 1.2之后就被弃用了,因为这两种方法都不安全,下面我们分别来讨论一下为什么不安全和应该怎样做才是安全的。 一、stop方法为什么不安全 其实stop方法天生就不安全,因为它在终止一个线程时会强制中断线程的执行,不管

xingjiarong的专栏 1万+

Android Audio其他——数字音频接口(附)

数字音频接口 DAI,即 Digital Audio Interfaces,顾名思义,DAI 表示在板级或板间传输数字音频信号的方式。相比于模拟接口,数字音频接口抗干扰能力更强,硬件设计简单,DAI 在音频电路设计中得到越来越广泛的应用。

小旭的专栏 1028

java thread exit方法_实例分析Java终止线程和stop()方法

Java终止线程实例和stop()方法源码阅读了解线程概念线程 是程序中的执行线程。Java 虚拟机允许应用程序并发地运行多个执行线程。线程特点拥有状态,表示线程的状态,同一时刻中,JVM中的某个线程只有一种状态;·NEW尚未启动的线程(程序运行开始至今一次未启动的线程)·RUNNABLE可运行的线程,正在JVM中运行,但它可能在等待其他资源,如CPU。·BLOCKED阻塞的线程,等待某个锁允许它...

weixin_34393451的博客 3414

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Java中的线程Thread方法之---stop

Java中的线程Thread方法之---stop

hgfujffg的博客 757

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

【独家揭秘】Java之父都害怕的stop()方法,你还在用吗?

在thread2中,我们同样通过synchronized关键字来获取lock对象的锁,并在持有锁的过程中调用thread1的stop()方法来停止thread1的执行。在上面的代码中,我们定义了一个DataInconsistencyDemo类,其中包含一个count变量和三个方法:increment()、decrement()和getCount()。例如,当线程正处于增加或减少操作的过程中时,如果我们调用stop()方法,那么count变量的值可能会处于一个中间状态,从而导致数据不一致。

赵KK的博客 996

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

为什么不能使用Thread.stop()方法?

从SUN的官方文档可以得知,调用Thread.stop()方法是不安全的,这是因为当调用Thread.stop()方法时,会发生下面两件事: 1. 即刻抛出ThreadDeath异常,在线程的run()方法内,任何一点都有可能抛出ThreadDeath Error,包括在catch或finally语句中。 2. 释放该线程所持有的所有的锁   当线程抛出ThreadDeath异常时,会导致

小雷的私人记事本 2478

为什么强烈不推荐使用stop、suspend方法来中断线程

我们知道像stop、suspend这几种中断或者阻塞线程的方法在较高java版本中已经被标记上了@Deprecated过期标签,那么为什么她们曾经登上了java的历史舞台而又渐渐的推出了舞台呢,到底是人性的扭曲还是道德的沦丧呢,亦或是她们不思进取被取而代之呢,如果是被取而代之,那么取而代之的又是何方人也,本文我们将一探究竟。 一、stop的落幕 首先stop方法的作用是什么呢,用java源码中的一句注释来了解一下:Forces the thread to stop executing.,即强制线程停止执

欢迎关注公众号:【码农突围】,回复9999,可以获取一份LeetCode刷题笔记 838

为什么不推荐使用 stop、suspend 方法中断线程?

以下文章来源方志朋的博客,回复”666“获面试宝典作者 |浪舟子来源 |https://blog.youkuaiyun.com/qq_40400960/article/details/112651...

方志朋的博客 351

在Java中如何优雅的停止一个线程?可别再用Thread.stop()了!

,这是一种协作机制,当其他线程通知需要被中断的线程后,线程中断的状态被设置为 true,但是具体被要求中断的线程要怎么处理,完全由被中断线程自己决定,可以在合适的时机中断请求,也可以完全不处理继续执行下去,这样一来,安全性就得到了保障。这个方法使用了@Deprecated修饰,代表着它是废弃的方法,在Java的编码规约中,过时的方法不建议继续使用,并且在这个方法的注释中官方也提示说这是一个不安全的强制恶意中断方法,会破坏线程的原子性。Ok,写了那么多,我们来写一个小的demo测试一下线程中断的方法。

JavaBuild的博客 3598

Thread源码-start及stop方法

环境:jdk1.8start方法源码如下:/** * 同步方法:启动线程 */ public synchronized void start() { //判断线程状态是否处于"NEW",0表示"NEW",如果不是则抛出异常 if (threadStatus != 0) throw new IllegalThreadStateException(); //添加到线程组中 group...

ignorewho的博客 1170

stop() 和 suspend() 方法为何不推荐使用?

stop()和suspend()stop()suspend()stop()suspend()stop()suspend()

weixin_45422672的博客 302

为什么强烈不推荐使用stop、suspend方法来中断线程?

点击上方“码农突围”,马上关注这里是码农充电第一站,回复“666”,获取一份专属大礼包真爱,请设置“星标”或点个“在看作者:浪舟子blog.youkuaiyun.com/qq_40400960/a...

欢迎关注公众号:【码农突围】,回复9999,可以获取一份LeetCode刷题笔记 186
上一篇: Oracle to_char格式化函数
下一篇: JAVA线程的缺陷
clbxp
博客等级 码龄21年 35粉丝 56原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值