有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Java线程同步管理中的静态关键字

我有一个关于下面代码的问题。为什么我需要在SumArray对象的声明前面加上“static”一词才能使代码正常运行?为什么同步方法不能保证(通过它自己)一次调用一个线程?事实上,如果我删除“static”字,那么SumArray方法将被2个线程调用。然而,两个线程的总和将是正确的

class SumArray {
    private int sum;

    synchronized int sumArray(int numbers[]) {
        sum = 0;

        for (int i = 0; i < numbers.length; i++) {
            sum += numbers[i];
            System.out.println("Current Sum for " + Thread.currentThread().getName() + " equals " + sum);

            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                System.out.println("Main Thread has been stopped");
            }

        }
        return sum;
    }
}

class MyThread implements Runnable {
    Thread t;
    int a[];
    int ans;
    static SumArray sa = new SumArray();

    MyThread(String name, int numbers[]) {
        t = new Thread(this, name);
        t.start();
        a = numbers;
    }

    public void run() {

        System.out.println(t.getName() + " is starting.");
        ans = sa.sumArray(a);

        System.out.println("Final Sum for " + t.getName() + " equals " + ans);
        System.out.println(t.getName() + " has been finished.");
    }
}

public class Main {
    public static void main(String[] args) {

        int a[] = { 1, 2, 3, 4, 5 };

        new MyThread("Thread 1", a);
        new MyThread("Thread 2", a);
    }
}

带有static SumArray sa = new SumArray();的代码的示例结果

Thread 2 is starting.
Thread 1 is starting.
Current Sum for Thread 2 equals 1
Current Sum for Thread 2 equals 3
Current Sum for Thread 2 equals 6
Current Sum for Thread 2 equals 10
Current Sum for Thread 2 equals 15
Current Sum for Thread 1 equals 1
Final Sum for Thread 2 equals 15
Thread 2 has been finished.
Current Sum for Thread 1 equals 3
Current Sum for Thread 1 equals 6
Current Sum for Thread 1 equals 10
Current Sum for Thread 1 equals 15
Final Sum for Thread 1 equals 15
Thread 1 has been finished.

结果是SumArray sa = new SumArray();

Thread 2 is starting.
Thread 1 is starting.
Current Sum for Thread 2 equals 1
Current Sum for Thread 1 equals 1
Current Sum for Thread 1 equals 3
Current Sum for Thread 2 equals 3
Current Sum for Thread 2 equals 6
Current Sum for Thread 1 equals 6
Current Sum for Thread 1 equals 10
Current Sum for Thread 2 equals 10
Current Sum for Thread 2 equals 15
Current Sum for Thread 1 equals 15
Final Sum for Thread 2 equals 15
Thread 2 has been finished.
Final Sum for Thread 1 equals 15
Thread 1 has been finished.

共 (1) 个答案

  1. # 1 楼答案

    因为在线程内部,您创建了一个新对象,它有自己的sumArray方法。当它是静态的时,整个jvm中只有一个sumArray函数属于类,而不是对象