解决线程安全方法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++) { synchronized (this){//把具有安全隐患的代码锁住即可,如果锁多了就会降低效率---》this就是这个锁 if (ticketNum>0){ System.out.println("我在"+Thread.currentThread().getName()+"买到了火车票:"+ticketNum--); } } } } }
【2】同步代码块演示2
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++) { synchronized (BuyTicketThread.class){//必须多个线程用的是同一把锁!!! BuyTicketThread.class 字节码信息具有唯一性 if (ticketNum>0){//对票数进行判断,票数大于零我们才抢票 System.out.println(getName()+"我买到了从北京到哈尔滨的第" + ticketNum-- + "火车票"); } } } } }
【3】同步监视器总结:
总结1:认识同步监视器(锁子)---synchronized(同步监视器){}
(1)必须是应用数据类型,不能是基本数据类型
(2)也可以创建一个专门的同步监视器,没有任何业务意义
(3)一般使用共享资源做同步监视器即可
(4)在同步代码块中不能改变同步监视器对象的引用
(5)尽量不要用String和包装类Integer做同步监视器
(6)建议使用final修饰同步监视器
总结2:同步代码块的执行过程
(1)第一个线程来到同步代码块,发现同步监视器open状态,需要close,然后执行其中的代码
(2)第一个线程执行过程中,发生了线程切换(阻塞就绪),第一个线程失去了cpu,但是没有开锁open
(3)第二个线程获取了cpu,来到了同步代码块,发现同步监视器close状态,无法执行其中的代码,第二个线程也进入阻塞状态
(4)第一个线程再次获取cpu,接着执行后续的代码;同步代码块执行完毕,释放锁open
(5)第二个线程也再次获取cpu,来到了同步代码块,发现同步监视器open状态,拿到锁并且上锁,由阻塞状态进入就绪状态,在进入运行状态,重复第一线程的处理过程(枷锁)
强调:同步代码块中能发生cpu的切换吗?能!!但是后续的被执行的线程也无法执行同步代码块(因为锁仍旧是close)
总结3:其它
(1)多个代码块使用了同一个监视器(锁),锁住一个代码块的同时,也锁住了所有使用该锁的所有代码块,其他线程无法访问其中的任何一个代码块
(2)多个代码块使用同一个同步监视器(锁),锁住一个代码块的同时,也锁住所有使用该锁的所有代码块,但是没有锁住使用其他同步监视器的代码块,其他线程有机会访问其他同步监视器的代码块。
【推荐】国内首个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搭建本