Java 在stacktrace程序中获取异常
我开发了这个程序来证明,如果线程在静态同步方法中,那么一个线程仍然可以从java中的该方法进入其他静态同步方法,但是我的程序抛出了异常,请告知它出了什么问题,下面是代码Java 在stacktrace程序中获取异常,java,multithreading,Java,Multithreading,我开发了这个程序来证明,如果线程在静态同步方法中,那么一个线程仍然可以从java中的该方法进入其他静态同步方法,但是我的程序抛出了异常,请告知它出了什么问题,下面是代码 package com.synchrnozie; class MyRunnable18 implements Runnable { @Override public void run() { method1(); } static synchronized void meth
package com.synchrnozie;
class MyRunnable18 implements Runnable {
@Override
public void run() {
method1();
}
static synchronized void method1() {
System.out.println("static synchronized void method1() started");
method2();
System.out.println("static synchronized void method1() ended");
}
static synchronized void method2() {
System.out.println("in static synchronized method2()");
method3();
}
static synchronized void method3() {
System.out.println("in static synchronized method3()");
method3();
}
}
public class staticNesting {
public static void main(String args[]) throws InterruptedException {
MyRunnable18 MyRunnable18 = new MyRunnable18();
Thread thread1 = new Thread(MyRunnable18, "Thread-1");
thread1.start();
}
}
下面是异常堆栈跟踪
Exception in thread "Thread-1" java.lang.StackOverflowError
at sun.nio.cs.SingleByte.withResult(Unknown Source)
at sun.nio.cs.SingleByte.access$000(Unknown Source)
at sun.nio.cs.SingleByte$Encoder.encodeArrayLoop(Unknown Source)
at sun.nio.cs.SingleByte$Encoder.encodeLoop(Unknown Source)
at java.nio.charset.CharsetEncoder.encode(Unknown Source)
at sun.nio.cs.StreamEncoder.implWrite(Unknown Source)
at sun.nio.cs.StreamEncoder.write(Unknown Source)
at java.io.OutputStreamWriter.write(Unknown Source)
at java.io.BufferedWriter.flushBuffer(Unknown Source)
at java.io.PrintStream.write(Unknown Source)
at java.io.PrintStream.print(Unknown Source)
at java.io.PrintStream.println(Unknown Source)
at com.synchrnozie.MyRunnable18.method3(staticNesting.java:24)
at com.synchrnozie.MyRunnable18.method3(staticNesting.java:25)
你的method3()无限地调用method3(),也许这就是原因 您正在对method3进行递归调用,这将导致StackFlow错误
static synchronized void method3() {
System.out.println("in static synchronized method3()");
method3();
}
您正在重复地从method3()调用method3(),所以这就结束了。你可以参考这个