如何处理多线程数据共享引发的问题--synchronized了解一下

一.什么是synchronized

  • synchronized就是为当前的线程声明一把锁,只有当当前线程执行完成后,其他线程才可以执行后续操作

  • synchronized的使用

  • a.使用synchronized修饰的方法控制对类方法的访问:

    访问修饰符 synchronized 返回类型 方法名(参数列表){……}

    b.使用synchronized来控制执行的代码块:

    synchronized(this){…};

二.如何处理多线程数据共享引发的问题

  • 首先我们来看一下示例代码
  • 多线程抢票程序
public class GrabThread extends Thread {
    int surplus=10;//设置当前票数10张
    int start=0;//已抢数量

    @Override
    public  void run() {
        if (surplus<=0)return;//当票数剩余0时,直接返回不在执行,当大于0时,执行以下代码
        surplus--;//当前剩余票数减一
        start++;//已抢票数加一
        System.out.println(Thread.currentThread().getName()+"已抢到第:"+start+"张票,剩余:"+surplus+"张票");//输出当前抢倒票的线程名与当前抢到的票的顺序以及剩余票数
    }

    public static void main(String[] args) {
        GrabThread grabThread=new GrabThread();//创建线程子类对象

       
        while (grabThread.surplus>0){//当当前票数大于0 时执行以下代码
            Thread thread=new Thread(grabThread,"携程");
            Thread thread1=new Thread(grabThread,"12306");
            thread.start();
            thread1.start();

        }
    }

输出结果:
携程买到了第3张票,还剩:7张
携程买到了第3张票,还剩:7张
携程买到了第4张票,还剩:6张
携程买到了第5张票,还剩:5张
携程买到了第6张票,还剩:4张
携程买到了第7张票,还剩:3张
12306买到了第3张票,还剩:7张
12306买到了第8张票,还剩:2张
携程买到了第10张票,还剩:0张
携程买到了第9张票,还剩:0张

  • 原因是当多个线程同时操作同一个对象是,一个线程没执行完,另一个线程已经在执行并修改数据,此时前一个线程输出的几个为后一个线程修改后的数据
  • 使用synchronized控制方法后
  • 代码示例
public class TestTicket implements Runnable {
  int ticket=10;
  int sold=0;
    @Override
    public synchronized void run() {//此处加入了synchronized来控制方法
        //synchronized (this) {
            if (ticket<=0)return;
                ticket--;
                sold++;

        System.out.println(Thread.currentThread().getName() + "买到了第" + sold + "张票,还剩:" + ticket + "张");
            }

    public static void main(String[] args) {

        TestTicket testTicket=new TestTicket();

        while (testTicket.ticket>0){
            Thread thread=new Thread(testTicket,"12306");
            Thread thread1=new Thread(testTicket,"携程");
            thread.start();
            thread1.start();


        }

    }
}

输出结果:
12306买到了第1张票,还剩:9张
携程买到了第2张票,还剩:8张
12306买到了第3张票,还剩:7张
携程买到了第4张票,还剩:6张
携程买到了第5张票,还剩:5张
12306买到了第6张票,还剩:4张
携程买到了第7张票,还剩:3张
携程买到了第8张票,还剩:2张
12306买到了第9张票,还剩:1张
携程买到了第10张票,还剩:0张

  • 使用锁,能很好的解决这个问题
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值