Java分布式系统高并发解决方案小结

本文总结了Java分布式系统中的高并发解决方案,探讨了同步和异步的区别、脏数据和不可重复读的概念,以及如何处理并发和同步,通过悲观锁和乐观锁策略。文章还分析了常见并发同步案例,如订票系统、股票交易和抢购秒杀,并提出了提高高并发下访问效率的常见手段,如使用缓存、优化数据库查询和采用线程池策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

现今,我们无时无刻不在接触网站与接口服务,如果网站或接口服务的访问量非常大的话,那么我们就需要考虑相关的并发访问问题了,而并发问题是绝大部分的软件工程师头疼的问题,既然逃避不掉,那我们就坦然面对吧~今天就让我们一起来研究一下常见的并发和同步。

为了更好的理解并发和同步,我们需要先明白两个重要的概念:同步和异步

一、同步和异步的区别和联系

  • 所谓同步,可以理解为在执行完一个函数或方法之后,一直等待系统返回值或消息,这时程序是出于阻塞的,只有接收到返回的值或消息后才往下执行其它的命令。同步在一定程度上可以看做是单线程,这个线程请求一个方法后就待这个方法给他回复,否则他不往下执行。

  • 异步,执行完函数或方法后,不必阻塞性地等待返回值或消息,只需要向系统委托一个异步过程,那么当系统接收到返回值或消息时,系统会自动触发委托的异步过程,从而完成一个完整的流程。异步在一定程度上可以看做是多线程的,请求一个方法后,就不管了,继续执行其他的方法。

  • 同步就是做完一件事情再做另一件事情。
    异步就是做一件事情,不引响做其他事情。

对于Java程序员而言,我们会经常听到同步关键字synchronized,假如这个同步的监视对象是类的话,那么如果当一个对象访问类里面的同步方法的话,那么其它的对象如果想要继续访问类里面的这个同步方法的话,就会进入阻塞,只有等前一个对象执行完该同步方法后当前对象才能够继续执行该方法。这就是同步。相反,如果方法前没有同步关键字修饰的话,那么不同的对象可以在同一时间访问同一个方法,这就是异步。

然后我们需要补充一下脏数据和不可重复读的相关概念

二、脏数据和不可重复读

  • 脏数据
    脏读就是指当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个事务也访问这个数据,然后使用了这
    个数据。因为这个数据是还没有提交的数据,那么另外一个事务读到的这个数据是脏数据(Dirty Data),依据脏数据所做的操作可能是不正确的。

  • 不可重复读
    不可重复读是指在一个事务内,多次读同一数据。在这个事务还没有结束时,另外一个事务也访问该同一数据。那么,在第一个事务中的两次读数据之间,由于第二个事务的修改,那么第一个事务两次读到的数据可能是不一样的。这样就发生了在一个事务内两次读到的数据是不一样的,因此称为是不可重复读

三、如何处理并发和同步

我们介绍的如何处理并发和同同步问题主要是通过锁机制来解决,锁机制有两个层面。

  • 代码层次上的,如java中的同步锁,典型的就是同步关键字synchronized,这里不做过多的讲解,感兴趣的同学可自行咨询度娘,案例很多。
  • 数据库层次上的,典型的就是悲观锁和乐观锁。

下面我们重点讲解的就是悲观锁(传统的物理锁)和乐观锁。

1、悲观锁(Pessimistic Locking):

悲观锁,正如其名,它指的是对数据被外界(包括本系统当前的其他事务,以及来自外部系统的事务处理)修改持保守态度,因此,在整个数据处理过程中,将数据处于锁定状态。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值