目录
synchronized 对象锁
第一种情况
:::info
结果:发短信打印,1s后打电话打印
分析:A线程和B线程是同一个对象调用方法,所以是同一把对象锁
流程:main线程执行,A线程就绪,A线程执行,synchronized对phone对象加锁,同时main线程睡眠1s后继续执行,B线程就绪等待phone对象解锁,A线程执行完phone对象解锁,B线程执行
:::
第二种情况
:::info
结果:4s后发短信打印,打电话打印
分析:A线程和B线程是同一个对象调用方法,所以是同一把对象锁
流程:main线程执行,A线程就绪,A线程执行,synchronized对phone对象加锁,A线程睡眠4s,同时main线程睡眠1s后继续执行,B线程就绪等待phone对象解锁,A线程执行完phone对象解锁,B线程执行
:::
第三种情况
:::info
结果:1s后hello打印,4s后发短信打印
分析:A线程调用的方法有锁,B线程调用的方法没有锁
流程:main线程执行,A线程就绪,A线程执行,synchronized对phone对象加锁,A线程睡眠4s,同时main线程睡眠1s后继续执行,B线程就绪,B线程执行,A线程执行完phone对象解锁
:::
第四种情况
:::info
结果:1s后打电话打印,4s后发短信打印
分析:A线程和B线程是不同对象调用方法,所以不是同一把对象锁
流程:main线程执行,A线程就绪,A线程执行,synchronized对phone1对象加锁,A线程睡眠4s,同时main线程睡眠1s后继续执行,B线程就绪,B线程执行,synchronized对phone2对象加锁,B线程执行完phone2对象解锁,A线程执行完phone1对象解锁
:::
synchronized 类锁
第五种情况
:::info
结果:4s后发短信打印,打电话打印
分析:A线程和B线程是同一个对象调用方法,且同步方法是静态方法,所以是同一把类锁
流程:main线程执行,A线程就绪,A线程执行,synchronized对Phone3类对象加锁,A线程睡眠4s,同时main线程睡眠1s后继续执行,B线程就绪等待Phone3类对象解锁,A线程执行完Phone3类对象解锁,B线程执行
:::
第六种情况
:::info
结果:4s后发短信打印,打电话打印
分析:A线程和B线程是不同对象调用方法,但调用的同步方法是静态方法,所以是同一把类锁
流程:main线程执行,A线程就绪,A线程执行,synchronized对Phone3类对象加锁,A线程睡眠4s,同时main线程睡眠1s后继续执行,B线程就绪等待Phone3类对象解锁,A线程执行完Phone3类对象解锁,B线程执行
:::
第七种情况
:::info
结果:1s后打电话打印,4s后发短信打印
分析:A线程和B线程是同一对象调用方法,但A线程调用的是静态同步方法,是类锁,B线程调用的是同步方法,是对象锁,所以不是同一把锁
流程:main线程执行,A线程就绪,A线程执行,synchronized对Phone4类对象加锁,A线程睡眠4s,同时main线程睡眠1s后继续执行,B线程就绪,B线程执行,synchronized对phone对象加锁,B线程执行完phone对象解锁,A线程执行完Phone4类对象解锁
:::
第八种情况
:::info
结果:1s后打电话打印,4s后发短信打印
分析:A线程和B线程是不同对象调用方法,且A线程调用的是静态同步方法,是类锁,B线程调用的是同步方法,是对象锁,所以不是同一把锁
流程:main线程执行,A线程就绪,A线程执行,synchronized对Phone4类对象加锁,A线程睡眠4s,同时main线程睡眠1s后继续执行,B线程就绪,B线程执行,synchronized对phone2对象加锁,B线程执行完phone2对象解锁,A线程执行完Phone4类对象解锁
:::