我正在尝试创建一个多线程程序,如果我注释掉 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/