java - 静态和非静态方法的同步

标签 java multithreading static thread-safety non-static

我有一个包含静态和非静态同步块(synchronized block)的代码。当我执行静态同步方法时,我得到了正确的输出。但是当我从同步方法中删除 static 关键字然后通过 WithSync 类的对象访问它时为什么我会收到 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):

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();
    }
}

关于java - 静态和非静态方法的同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59386774/

相关文章:

Java 在流中查找中位数

c++ - 如何在 Qt/c++ 中使用多线程通过 Api 访问我的数据库?

c# - 如何在 c# .net 中阻止一个方法直到另一个方法执行

ios - 如何将一个静态库.a文件添加到另一个静态库中

java - 如何将YouTube播放列表解析为ArrayList

java - 在分享 Intent android中设置字体

c++ - GDB 显示没有来自带有调试符号的应用程序的回溯

CSS:如何制作输入文本边框以覆盖其周围的文本?

android - 从静态 fragment 类调用主类中的方法

java - 使用 jSoup 将文本存储到字符串中