当前位置: 首页 > 知识库问答 >
问题:

同一程序的差异结果[关闭]

齐昊焱
2023-03-14

询问代码的问题必须证明对正在解决的问题有最低限度的理解。包括尝试的解决方案、为什么不起作用以及预期的结果。另请参阅:堆栈溢出问题检查表

public class suspendCheck extends Thread{

    int t ;

    public static void main(String args[]) throws InterruptedException {
        suspendCheck as = new suspendCheck();

        Thread t2 = new Thread(as);
        t2.start();
        Thread t3 = new Thread(as);
        t3.start(); }

    public void run(){
        if(t==0){
        System.out.println("JAVA Develper");
        t= ++t;
        }
        else{

            System.out.println("JAVA Test");
            }

        }
}

多次运行此程序后,存在差异和差异:

通常:

JAVA Develper
JAVA Develper

偶尔:

JAVA Develper
JAVA Test

共有3个答案

程项禹
2023-03-14

您不能保证线程的执行顺序。当您在线程上调用start()方法时,现在取决于线程调度程序的执行顺序

t1.start();
t2.start();

这并不意味着t1肯定会在t2之前运行。在您的示例中,您没有同步该方法,两个线程可能同时运行,或者当一个线程到达第4行时,另一个线程可能已经完成执行。

 public void run(){
        if(t==0){
        System.out.println("JAVA Develper");
        t= ++t;    //Line 4
        }
        else{

            System.out.println("JAVA Test");
            }

        }

同步方法将为线程提供对象锁。没有其他与runnable具有相同对象的线程能够同时访问同步块或方法。

 synchronized public void run()
益炜
2023-03-14

我只想在六分式中添加一个答案,你们应该在种族条件下阅读:

  • 这里
  • 这里

为了解释您在代码中所做的是让几个线程尝试获取一个整数,并以这样的方式进行更改,即其中一个线程可以在另一个线程获取该整数时对其进行更改,从而覆盖第一个线程给定的值。这就是为什么你会有这种行为

Java中的竞争条件是一种并发错误或问题,它是在您的程序中引入的,因为您的程序由多个线程同时并行执行,由于Java是一种多线程编程语言,因此竞争条件的风险在Java中更高,这需要清楚地了解是什么导致了竞争条件以及如何避免这种情况。

弘康安
2023-03-14

是的,这是可以接受的。这里唯一可怕的是,你试图使用线程而不知道它们的局限性。

你可以很容易地做到这一点与一个线程。你可以走这条安全的路。

线程不保证任何关于优化和排序的事情。如果您确实希望int正确更改,请将其设置为volatile和/或使用原子整数。如果您想要更好的控制,请使用锁和/或同步块。

在这种情况下,只需将t声明为volatile,并围绕对t或AtomicInteger的访问进行同步,然后使用该类的方法访问t。

作为将来的参考,在没有阅读所有相关警告的情况下尝试这些事情可能会导致死亡、窒息、发冷、发烧、呕吐、感染、恶心,以及无法控制昂贵的机器。

 类似资料:
  • 问题内容: 如何获得两个结果集的集合差异? 假设我有一个结果集(每个结果中只有一列): 我想通过result2减去result1中的结果:result1-result2等于: 问题答案: 要执行result1-result2,可以将result1与result2连接起来,并且只输出result1中存在的项目。例如: 请注意,这不是集合 差异 ,并且不会在result2中输出在result1中不存在

  • 这里有一个名为的小本体,由Protégé创建,其中我有类、、、和个体()、()和(也是)。在本体论中,我只声明。 当我在Protégé的DL Query选项卡中请求的实例时,我得到的是(它是,因此是,因此是)。 但当我编写以下SPARQ查询时: 我没有任何例子。当我将替换为时,结果是相同的。只有当我用替换它时,我才会得到所需的结果。 为什么DL查询做推断(允许我获得作为类的实例),而不是SPARQ

  • 基本上是标题。我想得到日期时间和当前时间之间的差异。日期以UTC为单位,我首先将当前时间转换为UTC,然后找到差异。但在两种情况下,转换为UTC或不转换为UTC的差异是相同的,但不应如此。 结果是 内/扑动 (20796): 2020-07-01 15:33:46.221975Z I/颤动 (20796): 2020-07-01 21:03:46.222207 I/颤振 (20796): 361

  • initial_value_generator将计算一个值,稍后由random_value_generator函数使用该值。该值由一个FILETIME对象和三个常量生成。正在发生缓冲区溢出,但未处理。random_value_generator每次使用时都会修改DWORD64 prng_initial_value。 我成功地构建了initial_value_generator函数。 我想我不能完成

  • 本文向大家介绍同步和异步时序电路之间的差异,包括了同步和异步时序电路之间的差异的使用技巧和注意事项,需要的朋友参考一下 顾名思义,同步时序电路和异步时序电路都是将反馈用于下一代输出的时序电路的类型,但是根据这种反馈的类型,可以区分两个电路。 以下是同步和异步时序电路之间的重要区别 - 序号 键 同步时序电路 异步时序电路 定义 另一方面,异步时序电路是数字时序电路,其中到下一个生成的输入的反馈不受

  • 本文向大家介绍函数与程序之间的差异,包括了函数与程序之间的差异的使用技巧和注意事项,需要的朋友参考一下 函数 在计算机编程语言环境中,功能是一组指令,这些指令需要一些输入并执行某些任务。在SQL中,函数返回一个值。 程序 过程也是一组指令,它们接受输入并执行某些任务。在SQL中,过程不返回值。在Java中,过程和函数是相同的,也称为子例程。 以下是SQL函数和SQL过程之间的重要区别。 序号 键