基于静态变量的Java同步方法

基于静态变量的Java同步方法,java,multithreading,concurrency,synchronized,Java,Multithreading,Concurrency,Synchronized,我正在上一堂关于Java并发性的大学课,最近有人给我一个简单的任务,创建5个线程,编号从1到5,然后让每个线程使用同步静态方法将其线程编号写入类中的一个静态变量 讲师给出的解决方案如下: public class thread1 extends Thread { private int threadNumber; private static int threadCount = 0; private static int value; public thread1(){ thre

我正在上一堂关于Java并发性的大学课,最近有人给我一个简单的任务,创建5个线程,编号从1到5,然后让每个线程使用同步静态方法将其线程编号写入类中的一个静态变量

讲师给出的解决方案如下:

public class thread1 extends Thread {

private int threadNumber;
private static int threadCount = 0;
private static int value;

public thread1(){
      threadNumber = ++threadCount;
      System.out.println("Thread " + threadNumber + " is created" );
}

public synchronized static void setValue(int v){
      value = v;
      try{
           Thread.currentThread().sleep(100);
      }
           catch(InterruptedException e ){}

      System.out.println("the current value of the variable is " + value);
}

public void run() {
    setValue(threadNumber);
    return;
}

public static void main(String[] args) {
    for(int i = 0; i < 5; i++){
        thread1 thr = new thread1();
        thr.start();
}

}
}   
输出应如下所示:

线程1已创建线程2已创建线程3已创建 已创建线程4已创建线程5已创建 变量的当前值为1。变量的当前值 变量为2变量的当前值为3 变量的当前值为4,即变量的当前值 变量是5

但我得到的结果如下:

public class thread1 extends Thread {

private int threadNumber;
private static int threadCount = 0;
private static int value;

public thread1(){
      threadNumber = ++threadCount;
      System.out.println("Thread " + threadNumber + " is created" );
}

public synchronized static void setValue(int v){
      value = v;
      try{
           Thread.currentThread().sleep(100);
      }
           catch(InterruptedException e ){}

      System.out.println("the current value of the variable is " + value);
}

public void run() {
    setValue(threadNumber);
    return;
}

public static void main(String[] args) {
    for(int i = 0; i < 5; i++){
        thread1 thr = new thread1();
        thr.start();
}

}
}   
线程1是通过线程创建的 2创建线程3创建线程4创建 创建线程5时,变量的当前值为1 变量的当前值为5,即变量的当前值 变量为4变量的当前值为3 变量的当前值为2

每次电流值的顺序明显不同

我得到的解决方案不正确吗?它显然无法实现其预期目的,即按顺序打印每个线程的值变量


有谁能告诉我如何让它以每次1到5的顺序打印线程编号?我认为使用synchronized setValue方法可以做到这一点,但显然不行。

不能保证线程会按照调用start方法的顺序执行。
同步块只意味着两个线程不能同时访问它。线程的运行顺序由调度程序决定

不能保证线程将按照您对其调用start方法的顺序执行。
同步块只意味着两个线程不能同时访问它。线程的运行顺序由调度程序决定

未定义线程进入监视器的顺序。一旦一个线程在监视器内完成执行,等待该监视器的任何其他线程都可以获得对关键部分的控制。

线程进入监视器的顺序没有定义。一旦一个线程在监视器内完成执行,等待该监视器的任何其他线程都可以控制关键部分。

讲师提供的解决方案绝对正确

由于创建了5个不同的线程,并且每个线程都必须访问同步的相同方法,因此无法获得预期的顺序

同步方法时,一次只有一个对象可以访问它

在您的情况下,只有一个线程可以访问setValue方法

您永远无法保证线程执行该方法的顺序


因此,每次运行此程序时,您都会得到一些不同的线程顺序。您的讲师提供的解决方案是绝对正确的

由于创建了5个不同的线程,并且每个线程都必须访问同步的相同方法,因此无法获得预期的顺序

同步方法时,一次只有一个对象可以访问它

在您的情况下,只有一个线程可以访问setValue方法

您永远无法保证线程执行该方法的顺序


因此,每次运行该程序时,您都会得到一些不同顺序的线程,同步只是为了防止多个线程同时出现在该方法中;它没有说明任何关于他们输入的顺序的信息;它没有说明他们输入它的顺序