Java中的线程问题:具有相同优先级的两个线程应该没有;订单“;正确的?

Java中的线程问题:具有相同优先级的两个线程应该没有;订单“;正确的?,java,multithreading,Java,Multithreading,我正在练习如何在Java中使用线程。目前,我试图证明两个单独的线程如何处理共享变量。我创建了一个类: public class Prac{ int z = 0; public void foo(int i){ this.z = i; System.out.println(Thread.currentThread().getName() + " updated z to " + z);

我正在练习如何在Java中使用线程。目前,我试图证明两个单独的线程如何处理共享变量。我创建了一个类:

    public class Prac{
        int z = 0;
        public void foo(int i){
            this.z = i;
            System.out.println(Thread.currentThread().getName() + " updated z to " + z);
            System.out.println("current z is " + this.z);
        }
        public static void main(String[] args){
            Prac p = new Prac();

            Thread t1 = new Thread(new MyThread1(p));
            Thread t2 = new Thread(new MyThread2(p));

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

    }
还有两条线:

public class MyThread1 implements Runnable{
    Prac p = null;

    public MyThread1 (Prac p){
        this.p=p;
    }

    public void run(){
        p.foo(1);
    }
}

public class MyThread2 implements Runnable{
    Prac p = null;

    public MyThread2 (Prac p){
        this.p=p;
    }

    public void run(){
        p.foo(2);
    }
}
我认为z的最终值有时应该是1,有时应该是2。然而,决赛总是2场。如果我将
t2.start()
移动到
t1.start()
之前,则最终值将始终为1。我认为两个优先级相同的线程不应该有特定的执行顺序,对吗?但为什么结果不是我所期望的呢

谢谢

我想证明

Java(以及大多数其他编程语言)中未同步线程的行为故意未定义。其原因是,不同多处理器系统的设计存在差异,而保留某些未定义的行为允许实现者在任何给定的硬件平台和操作系统上以最有效的方式进行操作

但是,通过给Java实现者以最有效的方式进行操作的自由,他们剥夺了您通过测试来证明线程的能力。如果某个程序在某一天的某台机器上每次运行时都以相同的方式运行,那么该程序在不同的机器上、不同的操作系统上、相同操作系统的不同版本上、不同的JVM中、不同的一天等可能会表现出不同的行为


如果您想保证多线程程序的任何特定结果,唯一的方法是使用有文档记录的同步机制,并根据这些保证推断程序的行为,如中所述,关于这些同步机制的作用。

这取决于系统。Java不会对特定系统管理线程的方式做出任何假设。如果可以,请尝试使用Windows、Linux。然后试试覆盆子皮。您很可能会注意到行为的变化。没有指定的顺序,但启动线程需要时间,因此当线程2启动时,线程1已经完成。@Andreas。。。启动线程并不意味着它正在运行。它只计划在将来的某个时候运行run方法。@spi是的,但由于计算机大多是多核的,第二个线程通常会在启动后立即开始运行。Raspberry Pi是单核的一个很好的例子。@Andreas right(顺便说一句,pi4有4个核),但我只是指出线程非常依赖于系统,您不能仅从单个执行上下文中假设将首先执行什么。当前负载也可以修改行为(压力过大的系统可能会延迟新线程的执行,因为它缺乏执行新线程的资源)