解决线程安全方法2:同步方法
【1】代码展示:
package com.msb.test03; import sun.security.krb5.internal.Ticket; /** * @author : liu * 日期:10:38:04 * 描述:IntelliJ IDEA * 版本:1.0 */ public class BuyTicketThread implements Runnable{ int ticketNum=10; @Override public void run() { for (int i = 1; i < 100; i++) { buyTicket(); } } public synchronized void buyTicket(){//锁住的是this if (ticketNum>0){ System.out.println("我在"+Thread.currentThread().getName()+"买到了火车票:"+ticketNum--); } } }
package com.msb.test01; /** * @author : liu * 日期:08:35:19 * 描述:IntelliJ IDEA * 版本:1.0 */ public class BuyTicketThread extends Thread{ public BuyTicketThread() { } public BuyTicketThread(String name){ super(name); } //一共10张票 static int ticketNum=10;//多个对象共享10张票 //每个窗口都是一个线程对象:每个对象执行的代码存入run方法中 @Override public void run() { for (int i = 1; i <= 100; i++) { buyTicket(); } } public static synchronized void buyTicket(){//用static 修饰 锁住的 同步监视器:BuyTicketThread.class if (ticketNum>0){//对票数进行判断,票数大于零我们才抢票 System.out.println(Thread.currentThread().getName()+"我买到了从北京到哈尔滨的第" + ticketNum-- + "火车票"); } } }
【2】总结:
总结1:
多线程在争抢资源,就要实现线程的同步(就要进行枷锁,并且这个锁必须是共享的,必须是唯一的)。
咱们的锁一般都是引用数据类型。
目的:解决了线程安全问题。
总结2:
(1)不要将run()定义为同步方法
(2)非静态同步方法的同步监视器是this
静态同步方法的见识其实 类名.class字节码信息对象
(3)同步代码块的效率要高于同步方法
原因:同步方法是将线程挡在了方法的外部,而同步代码块锁将线程挡在了代码块的外部,但是却是方法的内部
(4)同步方法的锁是this,一旦锁住一个方法,就锁住了所有的同步方法;同步代码块只是锁住使用该同步监视器的代码块,而没有锁住使用其他监视器的代码块
【推荐】国内首个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搭建本