示例代码
public class TestMain implements Runnable {
//格式化
static SimpleDateFormat sim = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
@Override
public void run() {
//让线程Thread-0执行同步方法1
if ("Thread-0".equals(Thread.currentThread().getName())) {
synchronizedMethod();
} else {
//让线程Thread-1执行同步方法2
synchronizedMethod2();
}
}
public synchronized void synchronizedMethod() {
Date satrtTime = new Date();
String time = sim.format(satrtTime);
System.out.println(time + ":【" + Thread.currentThread().getName() + "访问了同步方法1】");
try {
//睡眠3秒
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
Date endTime = new Date();
String time2 = sim.format(endTime);
System.out.println(time2 + ":【" + Thread.currentThread().getName() + "准备抛出异常了】");
throw new RuntimeException();
}
public synchronized void synchronizedMethod2() {
Date satrtTime = new Date();
String time = sim.format(satrtTime);
System.out.println(time + ":【" + Thread.currentThread().getName() + "访问了同步方法2】");
try {
//睡眠3秒
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
Date endTime = new Date();
String time2 = sim.format(endTime);
System.out.println(time2 + ":【" + Thread.currentThread().getName() + "准备退出这个同步方法了2】");
}
public static void main(String[] args) throws Exception {
//创建一个对象testMain1
TestMain testMain1 = new TestMain();
System.out.println("运行开始");
Thread thread1 = new Thread(testMain1);
Thread thread2 = new Thread(testMain1);
thread1.start();
thread2.start();
//让主线程做个等待,等线程一和线程二都执行完它才继续执行
thread1.join();
thread2.join();
System.out.println("运行结束");
}
}
运行结果:
总结
从运行结果可以看出,Thread-0线程抛出异常后,Thread-1线程能够继续执行,说明Thread-0线程在抛出异常后释放了锁,Thread-1线程才能获取到锁并进入同步方法执行。