关于Java的线程的stop方法为什么不推荐使用

反对使用stop(),是因为它不安全。它会解除由线程获取的所有锁定,而且如果对象处于一种不连贯状态,那么其他线程能在那种状态下检查和修改它们。结果很难检查出真正的问题所在。

网上查到资源是这么说的,那么什么叫“对象处于一种不连贯状态”,那么其他线程能在那种状态下检查和修改它们这句又怎么理解?

2个回答

假如一个线程正在执行:synchronized void { x = 3; y = 4;} 由于方法是同步的,多个线程访问时总能保证x,y被同时赋值,而如果一个线程正在执行到x = 3;时,被调用了 stop()方法,即使在同步块中,它也干脆地stop了,这样就产生了不完整的残废数据。而多线程编程中最最基础的条件要保证数据的完整性

就是有一个热水器(对象),本来调的是热水(就是指对象的属性),但是这个洗澡的人临时突然有事就出去了,没有继续占用这个热水器,接着下一个进来的人就不想洗热水,把热水调成了冷水,这时这个对象属性就发生了改变,就是这种改变,就是所谓其他线程修改了对象

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
Java读书笔记之线程Stop
Java线程不应使用stop方法粗暴地停止线程运行,使用状态标识解决 public class StopThreadUnsafe { public static User u = new User(); public static class User { private int id; private String name; public User() {
java线程为什么弃用stop,suspend方法
为什么弃用stop方法? 1、在stop的时候不只是你这一个线程受影响,所有和这个线程相关的锁也会释放。这是从语言上说。从业务上说,我们辛辛苦苦在代码中做的异常检查,回滚等操作就形同虚设了。 2、随意砍掉一条业务线,后续差擦屁股的事会少么? 为什么弃用suspend? 如condition中的wait,notify等都是成双成对,suspend也是一样,有resume对应,为什么不
为什么废弃stop方法
终断一个线程,可以用thread.interrupt( ) 和stop方法。 stop现在已经废弃,不推荐使用。 stop 是不安全的,通过与interrupt()的比较,可以看到stop是哪里不安全。 代码如下: [code="java"] public class ThreadTest { public static void main(String[] args) { ...
为什么java不推荐使用vector
从网上各处搜集的知识整理出来 1.因为vector是线程安全的,所以效率低,这容易理解,类似StringBuffer 2.Vector空间满了之后,扩容是一倍,而ArrayList仅仅是一半 3.Vector分配内存的时候需要连续的存储空间,如果数据太多,容易分配内存失败 4.只能在尾部进行插入和删除操作,效率低 ...
jquery之stop方法的使用
stop方法: 用于停止当前正在执行的动画,该方法有两个参数:第一个参数是clearQueue的布尔值,第二个参数是jumpToEnd的布尔值。 clearQueue:是否清除动画队列,true为清除,false则不清除; jumpToEnd:是否跳转到当前动画的最终效果,true为跳转,false则停留在当前状态 栗子: <body> <input type="b...
10-05 为什么不推荐使用 stop 和 destroy 方法来结束线程的运行?
1、让学者有面试的技能,运用面试相关的知识点 2、让求职突破面试难点,成功入职
为什么不推荐使用 setInterval
为什么不推荐使用 setInterval 首先简单介绍一下 js 的执行原理:js引擎是单线程的,主要分为主线程和事件队列,同步操作是在主线程上执行,而异步操作的函数会先放在事件队列当中,等到js主线程空闲了,才会去事件队列取出放到主线程,继续进行操作。定时器是属于异步事件,参数里面设置的时间,并不是延迟多少秒去执行回调函数,这个时间代表的是延迟多少秒,把回调函数放到异步队列,等待主线程空闲再被执...
request.getRealPath()方法不推荐使用
ServletActionContext.getRequest().getRealPath("");getRealPath上面有删除线是因为已经不推荐这样使用了 The method getRealPath(String) from the type ServletRequest is deprecated 可以使用 ServletActionContext.getRequest().
关于Java中Timer的stop方法
[img=https://img-bbs.csdn.net/upload/201804/13/1523611415_921817.png][/img]这个Timer怎么调用stop没用呢,
关于java线程的interrupt方法的使用总结
首先要说明的就是Lock,通过查看Lock的源码可知,Lock是一个接口: 1 2 3 4 5 6 7 8 public interface Lock {     void lock();     void lockInterruptibly() throws InterruptedExc
线程停止(stop/intrrupt)
使一个线程停止有下列三种方式: 使用标记位(设置flag)停止线程; 调用stop方法强制停止线程; Thread类的interrupt方法; 一:使用falg停止线程 ////使用标记位 class Mythread3 implements Runnable { private boolean flag=true; public void run() { ...
java中如何停止(stop)一个线程
i)停止(stop)一个线程(靠着return, break,或异常手段) 马克-to-win:java的官方文档说不要用stop方法来停止一个线程。因为stop方法太狠,太极端,会出现同步问题,使数据不一致。所以我们会通过设置标志,通过return, break,异常等手段来控制流程自然停止。 例:1.5.1 class MyThreadMark_to_win extends Threa...
Java线程join方法使用
话不多说,先上代码。public class TestJoin { public static void main(String[] args) throws Exception{ ThreadTestJoin t1=new ThreadTestJoin("小王"); ThreadTestJoin t2=new ThreadTestJoin("小明"); t1.start(...
java线程join方法的使用
新建一个实现了Runnable接口的类 class JoinThread implements Runnable{ @Override public void run() { // TODO Auto-generated method stub for (int i = 1; i < 20; i++) { System.out.println(Thread.currentThread...
java线程中sleep(),yield()和stop()的理解
1. Thread.yield():     api中解释: 暂停当前正在执行的线程对象,并执行其他线程。     注意:这里的其他也包含当前线程,所以会出现以下结果。 例子: public class ThreadTest implements Runnable{ boolean keepRunning=true; @Override public void run() {
java中有几种方法可以实现一个线程?用什么关键字修饰同步方法? stop()和suspend()方法为何不推荐使用?
java5 以前, 有如下两种: 第一种: new Thread(){}.start();这表示调用 Thread 子类对象的 run 方法, new Thread(){}表示一个Thread 的匿名子类的实例对象, 子类加上 run 方法后的代码如下: new Thread(){ public void run(){ } }.start(); 第二种: new T...
java中有几种方法可以实现一个线程?用什么关键字修饰同步方法 stop()和suspend()方法为何不推荐使用?
java5以前,有两种实现方法,分别使用new Thread()和new Thread(runnable)形式,第一种继承Thread类,直接调用thread的run方法,所以,我们往往使用Thread子类,即new SubThread()。第二种是实现Runnable接口,调用runnable的run方法。第一种: new Thread(){}.start();这表示调用Thread子类对象的ru
Java 线程的suspend()和stop()不安全的原因
一、suspend()不安全的原因        在Java中线程的suspend()方法用于悬挂起一个线程,但是它之前持有的锁却没有释放。那么其他等待该锁的线程就会一直等待,直到该线程被resume(),那么在这种情况下,有可能造成循环等待,进而死锁。因此Java已经不推荐使用该方法。 二、stop()方法不安全的原因       在Java中线程的stop()方法用于停止一个线程
【8】java线程初识,stop和sleep区别
1、线程 每一个线程都有自己运行的内容。这个内容可以称为线程要执行的任务。多线程好处:解决了多部分同时运行的问题。多线程的弊端:线程太多回到效率的降低。其实应用程序的执行都是cpu在做着快速的切换完成的,这个切换是随机的。 JVM启动时就启动了多个线程,至少有两个线程可以分析的出来。 [1-1]执行main函数的线程,该线程的任务代码都定义在main函数中。 [1-2]负责垃圾回收的线程。 2、...
java中可以实现一个线程的方法
有两种实现方法,分别是继承Thread类与实现Runnable接口用synchronized关键字修饰同步方法反对使用stop(),是因为它不安全。它会解除由线程获取的所有锁定,而且如果对象处于一种不连贯状态,那么其他线程能在那种状态下检查和修改它们。结果很难检查出真正的问题所在。suspend()方法容易发生死锁。调用suspend()的时候,目标线程会停下来,但却仍然持有在这之前获得的锁定。此
java线程--关于interrupt()方法
java中停止一个线程可以使用Thread.interrupt()方法,但是这个方法并不会立刻停止线程。
java.util.Date().toLocaleString()为什么不推荐使用???
java.util.Date().toLocaleString()rn为什么不推荐使用???
JavaScript中为什么不推荐使用全局变量!
var variable = "hello World" console.log(variable) console.log(window.variable) console.log(this.variable); console.log(window["variable"]) variable是在全局中声明的一个变量,这玩意的好处就是你可以在任何地方访问到他。   但是这样会造成的后果...
为什么微软不推荐使用WritePrivateProfileString?
微软msdn说WritePrivateProfileString只是为了兼容,应该用注册表存储程序信息。rnrn可是我觉得读写注册表明显没有写INI文件方便阿? 为什么微软提倡用注册表呢?
为什么在php不推荐使用mysql_*的函数?
为什么在php不推荐使用mysql_*的函数? 比如说(mysql_query(), mysql_connect() or mysql_real_escape_string())?回答1因为Mysql在拓展: 不是积极的开发 在PHP5.5中已经被废弃了 在PHP7中已经被全部移出了 缺少OO(面向对象)的接口 并不支持以下:非堵塞、异步查询 预处理语句和参数化查询 存储过程 多个声明 事务处理
MySQL为什么不推荐使用null值
(随笔)MySQL为什么不推荐使用null值1新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 1 你好! 这是...
为什么不推荐使用 GreenDao 的多表关联特性
本文目录: 概述 舍弃关联特性 数据一致性问题 概述 GreenDao 是一个很成熟的 ORM 框架 ,帮助我们不用去写繁琐的 SQL 去实现 CURD,还有数据库的升级等繁琐的操作都被模板化,让我们更加关注于业务实现上。 在平时的使用中,多表关联会经常遇到。 多表关联主要有这几种: 一对一关联,@ToOne 一对多关联,@ToMany 多对多关联,比较复杂,而且少见...
为什么MySQL不推荐使用子查询和join
前言: 1.对于mysql,不推荐使用子查询和join是因为本身join的效率就是硬伤,一旦数据量很大效率就很难保证,强烈推荐分别根据索引单表取数据,然后在程序里面做join,merge数据。 2.子查询就更别用了,效率太差,执行子查询时,MYSQL需要创建临时表,查询完毕后再删除这些临时表,所以,子查询的速度会受到一定的影响,这里多了一个创建和销毁临时表的过程。 3.如果是JOIN的话,它...
【原创】数据库中为什么不推荐使用外键约束
引言 其实这个话题是老生常谈,很多人在工作中确实也不会使用外键。包括在阿里的JAVA规范中也有下面这一条 【强制】不得使用外键与级联,一切外键概念必须在应用层解决。 但是呢,询问他们原因,大多是这么回答的 每次做DELETE 或者UPDATE都必须考虑外键约束,会导致开发的时候很痛苦,测试数据极为不方便。 坦白说,这么说也是对的。但是呢,不够全面,所以开一文来详细说明。 正文 首先我们明...
不使用stop方法停止线程,停止线程的最佳办法
线程启动完毕后,在运行时可能需要终止,Java提供的终止方法只有一个stop,但是我 不建议使用这个方法,因为它有以下三个问题: (1)  stop方法是过时的 从Java编码规则来说,已经过时的方法不建议采用。 (2)  stop方法会导致代码逻辑不完整 stop方法是一种“恶意”的中断,一旦执行stop方法,即终止当前正在运行的线程,不 管线程逻辑是否完整,这是非常危险的。看如下的代码
Hibernate为什么不推荐使用联合主键
Hibernate为什么不推荐使用联合主键,能说明一下原因吗?谢谢!
JAVA9之后不推荐使用newInstance()方法
根据JAVA9的API 我们可以看见反射中的newInstance()方法不推荐使用了,用 clazz.getDeclaredConstructor().newInstance() 代替 例如 package reflect; import java.lang.reflect.InvocationTargetException; /** * 获取class对象的几种方法 * 对...
为什么线程不结束
这个是获取声音文件长度的函数,在main中调用 时线程不会结束,为什么 rnpublic static double getLength(String path)throws Exceptionrn AudioInputStream stream;rn stream = AudioSystem.getAudioInputStream(new URL(path));rn // At present, ALAW and ULAW encodings must be convertedrn // to PCM_SIGNED before it can be playedrn AudioFormat format = stream.getFormat();rn if (format.getEncoding() != AudioFormat.Encoding.PCM_SIGNED) rn format = new AudioFormat(rn AudioFormat.Encoding.PCM_SIGNED,rn format.getSampleRate(),rn format.getSampleSizeInBits()*2,rn format.getChannels(),rn format.getFrameSize()*2,rn format.getFrameRate(),rn true); // big endianrn stream = AudioSystem.getAudioInputStream(format, stream);rn rn // Create the cliprn DataLine.Info info = new DataLine.Info(rn Clip.class, stream.getFormat());rn Clip clip = (Clip) AudioSystem.getLine(info);rn // This method does not return until the audio file is completely loadedrn //clip.open(stream);rn clip.stop();rn clip.close();rn return clip.getBufferSize() /(clip.getFormat().getFrameSize() * clip.getFormat().getFrameRate());rn rnrnrnrn
为什么线程不运行???
在窗体1(Form1)建立新线程:rnTDrawThread *pdraw=new TDrawThread(false);rnrn在TDrawThread内执行rnvoid __fastcall TDrawThread::Execute()rnrn //---- Place thread code here ----rn dorn rn Synchronize(draw);rn while(!Terminated);rnrnvoid __fastcall TDrawThread::draw()rnrn i++;rn Form1->Edit1->Text=i;rnrnrn在不点击窗体1的标题栏和拖拉窗体1的标题栏时,线程运行正常(Form1->Edit1的内容在变化),但点击或拖拉标题栏时,线程TDrawThread好像就没有运行了(Form1->Edit1的内容无变化),请问有遇到相似情况的吗??该怎么解决呢???rnrn请达人指教一下,困扰我很久了阿!
Android使用MediaRecorder的stop方法报"stop failed"错误的解决方案
一、 问题描述 如下所示,调用recorder.stop()时抛出异常: Caused by: java.lang.RuntimeException: stop failed. at android.media.MediaRecorder.stop(Native Method) 二、 分析原因 start和stop间隔时间太短: 三、 解决方案 调用stop...
java线程学习(二): 终止线程讲解:Stop()方法(后附如何正确终止线程)
本章来学习Java的stop线程终止方法; 老规矩,先看源码: @Deprecated public final void stop() { SecurityManager var1 = System.getSecurityManager(); if (var1 != null) { this.checkAccess(); if (this != currentThread...
####关于“推荐”和不推荐“的问题
我想在首也上显示我想自顶的新闻图片,那我的后台必须有一个rn 不推荐rn 推荐rn “推荐”“不推荐”能不能在数据库里实现啊,如果程序是怎么实现的。rnrn
java 为什么说,不推荐使用+来连接字符串?
在java中,有个说法,不推荐使用+来连接字符串,这是为什么呢? 来段测试代码这是源代码 String s = "a"+"b"+"c"; for(int i=0; i<10; i++){ s=s+"a"+"b"; s= s+"a"+"b"+s; }编译为class文件后,再使用jad反编译后,看看编译器对代码干了什么,如下String s = "abc"; for(int
java中,为什么弃用stop和suspend方法
一、stop和suspend方法作用 它们是Thread类的方法 stop:用来终止一个线程 suspend:用来阻塞一个线程直至另一个线程调用resume 二、弃用原因 stop天生就不安全,经验证明suspend经常导致死锁 1、stop弃用 它终止未结束的方法(包括run方法),这会导致对象处于不一致状态。 例:从一个账户向另一个账户转账的过程中被终止,钱已经转出,但
OnPaint()为什么不能在线程中使用?
线程函数rnUINT Drinkwater1(LPVOID pParam)rnrn while(c1==false)rn rn if(m_top<=0)rn break;rn elsern rn m_top--;rn if(m_top<=0)rn break;rn (CWnd*)pParam->OnPaint();rn Sleep(90);rn rn rnrn return 0;rnrn为什么不行呢?要怎样使用呢?我想在线程函数中调用OnPaint()函数来实现重复执行画相同的图。如此法不行,其他方法是什么?谢谢!
相关热词 c#部署端口监听项目、 c#接口中的属性使用方法 c# 昨天 c#func链接匿名方法 c#怎么创建文件夹 c#从键盘接收空格 c#da/ad c#部门请假管理系统 c#服务器socket c# 默认的访问修饰符