静态和非静态方法的同步

Synchronization for a static and non static methods

我有一个包含静态和非静态同步块的代码。当我执行静态同步方法时,我得到了正确的输出。但是当我从同步方法中删除静态关键字然后通过 WithSync 的对象访问它时 class 为什么我得到 NullPointerException?

带有静态关键字的代码:

    public class WithSync extends Thread {

        public static synchronized void add(int a) {
        for(int i=0;i<5;i++) {
        System.out.println(a*i);
        System.out.println(Thread.currentThread());
        }
    }
    public void run() {
        WithSync.add(5);
    }


    public static void main(String[] args) {

    WithSync t1 = new WithSync();
    WithSync t2 = new WithSync();

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

**Code without Static Keyword:**

    public class WithSync extends Thread {
        WithSync ws;
        public synchronized void add(int a) {
            for(int i=0;i<5;i++) {
            System.out.println(a*i);
            System.out.println(Thread.currentThread());
            }
        }
        public void run() {
            ws.add(5);
        }


        public static void main(String[] args) {

        WithSync t1 = new WithSync();
        WithSync t2 = new WithSync();

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

异常:

Exception in thread "Thread-0" Exception in thread "Thread-1" java.lang.NullPointerException
    at com.inno.mthread.WithSync.run(WithSync.java:12)
java.lang.NullPointerException
    at com.inno.mthread.WithSync.run(WithSync.java:12)

首先,您遇到错误是因为您没有初始化变量。

此外,如果您初始化 ws 变量,您将进行无限递归。

所以停止使用 ws 变量。我认为这应该有效

public class WithSync extends Thread {
    public synchronized void add(int a) {
        for(int i=0;i<5;i++) {
        System.out.println(a*i);
        System.out.println(Thread.currentThread());
        }
    }
    public void run() {
        add(5);
    }


    public static void main(String[] args) {

    WithSync t1 = new WithSync();
    WithSync t2 = new WithSync();

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