解决线程安全方法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)多个代码块使用同一个同步监视器(锁),锁住一个代码块的同时,也锁住所有使用该锁的所有代码块,但是没有锁住使用其他同步监视器的代码块,其他线程有机会访问其他同步监视器的代码块。

posted @   爱的加勒比  阅读(32)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
点击右上角即可分享
微信分享提示