JUC练习4——理解synchronized锁的对象
1,普通方法synchronized锁的是当前对象:
2,静态的synchronized方法锁的当前类对象
3,哪个线程先获取到锁,它就先执行。
4,类对象锁不会比普通对象锁先执行。
示例代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 | import java.util.concurrent.TimeUnit; public class JucTest2 { public static void main(String[] args) throws InterruptedException { Phone phone = new Phone(); Phone phone1 = new Phone(); new Thread(()->{phone.sendMsg();}, "A" ).start(); //拿到phone锁后,等待4秒,打印发短信 TimeUnit.SECONDS.sleep( 1 ); //保证发短信方法先拿到phone对象锁 new Thread(()->{phone.call();}, "B" ).start(); //call()需要获取到phone锁,由于phone锁被sendMsg()占用所以需要等待它释放锁 new Thread(()->{phone1.call();}, "B1" ).start(); //直接拿到phone1锁,打印phone1打电话 new Thread(()->{phone.playGame();}, "C" ).start(); //普通方法没有锁直接执行,打印玩游戏 new Thread(()->{phone.QQ();}, "D" ).start(); //静态的synchronized方法锁的当前类对象,他先获取的锁所以先执行 new Thread(()->{phone1.WeChat();}, "E" ).start(); //由于没有拿到锁,所以需要等待QQ()方法执行完毕释放锁后,获取锁执行 } } class Phone { synchronized void sendMsg() { try { TimeUnit.SECONDS.sleep( 4 ); //睡眠4秒,call方法正在等待sendMsg方法执行完毕,释放锁 } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName()+ "发短信" ); } synchronized void call() { System.out.println(Thread.currentThread().getName()+ "打电话" ); } void playGame() { System.out.println(Thread.currentThread().getName()+ "玩游戏" ); } static synchronized void QQ() { try { TimeUnit.SECONDS.sleep( 4 ); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName()+ "玩QQ" ); } static synchronized void WeChat() { System.out.println(Thread.currentThread().getName()+ "玩微信" ); } } |
标签:
java多线程
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本