package com.study.thread; public class MyObjectTest { public static synchronized void printNum () throws InterruptedException { System.out.println("----------------------------printNum----------------------------"); Thread.sleep(4000); } public static void printNum1 () throws InterruptedException { System.out.println("----------------------------printNum1----------------------------"); } public static void main(String[] args) { /** * 分析 当多线程访问 mythread run 方法时, 已排队的方式执行处理(这里排队时按住 cpu 分配顺序执行的) */ MyObjectTest t1 = new MyObjectTest(); new Thread(new Runnable() { @Override public void run() { try { t1.printNum(); } catch (InterruptedException e) { e.printStackTrace(); } } }).start(); new Thread(new Runnable() { @Override public void run() { try { t1.printNum1(); } catch (InterruptedException e) { e.printStackTrace(); } } }).start(); } }
两行代码同事输入
中间没有间隔,可以看到,调用 printNum 方法的时候,printNum1也是可以调用的
代码修改如下:
再次输出,会发现, printNum 结束之后 printNum1 并没有立即执行,而是等了四秒之后再执行
原因分析如下:
A线程持有对象 object 的lock 锁,这个时候,B 线程是可以调用 object中 synchronized 没有修饰的方法的
A线程持有对象 object 的lock 锁,这个时候,B 线程是可以调用 object中 synchronized 修饰的方法的时候 需要等待