我有一个包含静态和非静态同步块(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/