Java中的多线程问题:两个优先级相同的线程应该没有“顺序”对吗?
我正在练习如何在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。然而,决赛总是两场。如果我把t2.start()
移到t1.start()
之前,最后的结果总是1。我认为两个优先级相同的线程不应该有特定的执行顺序,对吧?但为什么结果不是我所期望的呢
谢谢
# 1 楼答案
在Java(以及大多数其他编程语言)中,未同步线程的行为是故意不定义的。原因是,不同多处理器系统的设计存在多样性,如果不定义某些行为,则实现者可以在任何给定的硬件平台和操作系统上以最高效的方式进行操作
但是,通过给Java实现者以最有效的方式做事情的自由,他们剥夺了你通过测试来证明线程的能力。如果某个程序在某一天的某台机器上每次运行时都以相同的方式运行,那么它在不同的机器上、不同的操作系统上、同一操作系统的不同版本上、不同的JVM中、不同的一天等可能会表现出不同的行为
如果您想保证多线程程序的任何特定结果,唯一的方法就是使用有文档记录的同步机制,并根据Java Language Specification的Chapter 17中所述的保证推断程序的行为,说明这些同步机制将做什么