注释印刷线会导致逻辑变化

时间:2016-01-10 14:43:56

标签: java multithreading

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

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();
    }

}

1 个答案:

答案 0 :(得分:4)

此程序不是线程安全的。首先,应该对静态变量的var adapter = new ChatListAdapter(this, (IMvxAndroidBindingContext)BindingContext); _chatList = FindViewById<MvxListView>(Resource.Id.chat_list_view); _chatList.Adapter = adapter; 操作进行同步,或者应该使用k++

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

你的计划还有一个竞争条件。检查获胜者条件也应同步。

您应该仔细分析线程使用共享AtomicInteger变量的方式。