java - 注释打印行会导致逻辑发生变化

标签 java multithreading

我正在尝试创建一个多线程程序,如果我注释掉 running 的打印行,那么逻辑将改变并打印前三个作为赢家。如果没有评论,那么这可以正常工作并正确打印他们的位置。

package beans;
import java.lang.Thread;

class xyz extends Thread
{
    String a;
    static int k=1;
    xyz(String c)
    {
        a=c;
    }
    public void run()
    {
        int i;
        for(i=0;i<15;i++)
        {
        System.out.println(a+" is running in "+i+"km");
        if(k==1 && i==14)
        {
            System.out.println(a+" is the winner");
            k++;

        }
        else if(k>1 && i==14)
        {
            System.out.println(a+" is in "+k+ "place");
            k++;
        }

        }
    }
}

public class abc {

    public static void main(String[] args) {

        xyz t1= new xyz("car");
        t1.start();
        xyz t2= new xyz("bike");
        t2.start();
        xyz t3= new xyz("cycle");
        t3.start();
        xyz t4= new xyz("walk");
        t4.start();
        xyz t5= new xyz("arjun");
        t5.start();
    }

}

最佳答案

这个程序不是线程安全的。首先,对静态变量的k++操作应该是同步的,或者应该使用AtomicInteger

当您的程序不是线程安全的时,不确定行为是一种非常常见的情况。打印出一些东西会影响线程的执行方式,导致删除这些操作的原因可能会影响您的程序行为(这绝对是正常的,但不是我们想要的)。

您的程序中还有一个竞争条件。检查获胜者条件也应该同步。

你应该仔分割析线程使用共享k变量的方式。

关于java - 注释打印行会导致逻辑发生变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34706698/

相关文章:

java - JAVA中跨线程统一分割目录中的文件

java - 为什么人们 gitignore .classpath 和 .project?

java - 服务器处理时间延迟事件

multithreading - 如何将对堆栈变量的引用传递给线程?

java - 要求 FutureTask 在取消之前启动

java - 您应该始终使用 ExecutorService 而不是启动自己的线程吗?

c# - 当网站重新编译时,IIS 中已运行的线程会发生什么情况?

java - <上下文 :annotation-config> and <context:component-scan>

java - 帮助解决 hibernate 中的异常

java - Java中有没有办法提取数组中对象的所有属性名称