package com.test.testThread;
import com.test.sort.Test;
import java.util.concurrent.TimeUnit;
public class TestThread {
public synchronized void method1() {
try {
TimeUnit.SECONDS.sleep(20);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + " enter to method1");
}
public void method2() {
synchronized (this) {
try {
TimeUnit.SECONDS.sleep(20);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + " enter to method2");
}
}
public static void main(String[] args) {
TestThread testThread = new TestThread();
new Thread(testThread::method1, "test1").start();
new Thread(testThread::method2, "test2").start();
}
}
控制台输出:
test1 enter to method1
test2 enter to method2
分析 :两个线程对于同步方法也是,同一时刻,由一个线程获得lock,而执行一个方法,另一个进入阻塞状态。
运行 jstack -l [pid] (注:pid:该程序运行的端口号,可以通过任务管理器查询相关java.exe的运行时的端口号)
at com.test.testThread.TestThread.method1(TestThread.java:11)
- locked <0x00000000eb110c50> (a com.test.testThread.TestThread)
at com.test.testThread.TestThread.method2(TestThread.java:20)
- waiting to lock <0x00000000eb110c50> (a com.test.testThread.TestThread)
两次看出先是执行method1的线程被锁,然后是执行method2的线程被锁。 印证同一时刻只有一个线程执行一个同步方法。