美文网首页
3.多线程的并发问题

3.多线程的并发问题

作者: xialedoucaicai | 来源:发表于2018-05-18 18:08 被阅读0次

多线程在提高运行效率的同时,也带来了并发问题,所谓并发问题就是多线程操作共享资源,导致数据状态异常。
以买票为例,10个人登录了12306,但余票只有5张。

  1. 初始状态有5张票,用户1来买,余票为5,付钱准备出票
  2. 这时用户2也来买,由于票还没出,所以查询发现余票仍未5,付钱准备出票
  3. 此时用户1出票,余票减一变为4
  4. 用户2也出票了,余票减一也变为了4

问题就出在这里,现在实际只有3张票,但余票却显示为4张,余票作为一个共享资源,因为多线程,导致状态异常了,运行下列代码,会发现余票最终成为了负值。

代码示例:

public class Ticket {
    public int total = 5;
    
    public void buy() throws InterruptedException{
        if(total > 0){
            //模拟中间过程
            Thread.sleep(100);
            --total;
        }
    }
    
    public static void main(String[] args) throws InterruptedException {
        Ticket ticket = new Ticket();
        TicketThread ticketThread = new TicketThread(ticket);
        //10个人抢5张票
        for(int i=0;i<10;i++){
            new Thread(ticketThread).start();
        }
        //确保所有线程都执行完了
        Thread.sleep(3000);
        System.out.println("剩余:"+ticket.total);
    }
}
public class TicketThread implements Runnable{
    Ticket ticket = null;
    public TicketThread(Ticket ticket) {
        this.ticket = ticket;
    }
    
    @Override
    public void run() {
        try {
            ticket.buy();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

那如何解决这个问题呢?我们可以为buy()方法加上synchronized关键字,保证某一时刻只能有一个线程在执行buy()方法,这就相当于让多线程排队,强制变成了单线程,这样就可以解决并发问题了。下一节我们将更细致的探讨synchronized关键字。

相关文章

  • 【线程的另一种形式】

    今天研究的问题: 1. Go并发忧于Java并发? 2. Go语言的并发是多线程实现的么? 3. Java并...

  • 3.多线程的并发问题

    多线程在提高运行效率的同时,也带来了并发问题,所谓并发问题就是多线程操作共享资源,导致数据状态异常。以买票为例,1...

  • Python并发:多线程与多进程

    本篇概要 1.线程与多线程 2.进程与多进程 3.多线程并发下载图片 4.多进程并发提高数字运算 学习Python...

  • 后端架构师技术图谱(三)-并发、锁、设计模式(二)

    并发 多线程 《40个Java多线程问题总结》 线程安全 《Java并发编程——线程安全及解决机制简介》 一致性、...

  • 多线程并发 (五) ReentrantLock 使用和源码

    章节: 多线程并发 (一) 了解 Java 虚拟机 - JVM 多线程并发 (二) 了解 Thread 多线程并发...

  • 2018-12-27 我需要学习的技能

    1.程序对错误输入,数据问题的处理 2.事务处理 3.分布式系统 4.并发,多线程,io相关

  • 闲言之PHP不支持多线程??

    前言 为什么考虑到多线程呢?--------为了有效率的解决并发问题; 那怎么将多线程应用结合到PHP应用解决并发...

  • synchronized

    synchronized 并发编程的三个问题:并发性,原子性,有序性 多线程并发时候可能出现可见性问题:就是在多线...

  • 一些基础之一

    高并发 面试的时候都喜欢问这个问题,解决高并发的问题根源在于解决高并发下共享资源的控制问题。也就牵扯到多线程下共享...

  • 10信号量与管程

    18.1信号量 回顾 ■并发问题 多线程并发导致资源竞争 ■同步概念 协调多线程对共享数据的访问 任何时刻只能有一...

网友评论

      本文标题:3.多线程的并发问题

      本文链接:https://www.haomeiwen.com/subject/slggdftx.html