美文网首页Java面试常见问题
分布式环境下,怎么保证线程安全

分布式环境下,怎么保证线程安全

作者: 2_shou | 来源:发表于2018-06-07 17:08 被阅读0次

转载来源:探索并发编程(七)------分布式环境中并发问题


避免并发

在分布式环境中,如果存在并发问题,那么很难通过技术去解决,或者解决的代价很大,所以我们首先要想想是不是可以通过某些策略和业务设计来避免并发。比如通过合理的时间调度,避开共享资源的存取冲突。另外,在并行任务设计上可以通过适当的策略,保证任务与任务之间不存在共享资源,比如在以前博文中提到的例子,我们需要用多线程或分布式集群来计算一堆客户的相关统计值,由于客户的统计值是共享数据,因此会有并发潜在可能。但从业务上我们可以分析出客户与客户之间 数据是不共享的,因此可以设计一个规则来保证一个客户的计算工作和数据访问只会被一个线程或一台工作机完成,而不是把一个客户的计算工作分配给多个线程去 完成。这种规则很容易设计,例如可以采用hash算法。

时间戳

分布式环境中并发是没法保证时序的,无论是通过远程接口的同步调用或异步消息,因此很容易造成某些对时序性有要求的业务在高并发时产生错误。比如系统A需要把某个值的变更同步到系统B,由于通知的时序问题会导致一个过期的值覆盖了有效值。对于这个问题,常用的办法就是采用时间戳的方式,每次系统A发送变更给系统B的时候需要带上一个能标示时序的时间戳,系统B接到通知后会拿时间戳与存在的时间戳比较,只有当通知的时间戳大于存在的时间戳,才做更新。这种方式比较简单,但关键在于调用方一般要保证时间戳的时序有效性。

串行化

有的时候可以通过串行化可能产生并发问题操作,牺牲性能和扩展性,来满足对数据一致性的要求。比如分布式消息系统就没法保证消息的有序性,但可以通过变分布式消息系统为单一系统就可以保证消息的有序性了。另外,当接收方没法处理调用有序性,可以通过一个队列先把调用信息缓存起来,然后再串行地处理这些调用。

数据库

分布式环境中的共享资源不能通过Java里同步方法或加锁来保证线程安全,但数据库是分布式各服务器的共享点,可以通过数据库的高可靠一致性机制来满足需求。比如,可以通过唯一性索引来解决并发过程中重复数据的生产或重复任务的执行;另外有些更新计算操作也尽量通过sql来完成,因为在程序段计算好后再去更新就有可能发生脏复写问题,但通过一条sql来完成计算和更新就可以通过数据库的锁机制来保证update操作的一致性。

行锁

有的事务比较复杂,无法通过一条sql解决问题,并且有存在并发问题,这时就需要通过行锁来解决,一般行锁可以通过以下方式来实现:
对于Oracle数据库,可以采用select ... for update方式。这种方式会有潜在的危险,就是如果没有commit就会造成这行数据被锁住,其他有涉及到这行数据的任务都会被挂起,应该谨慎使用
在表里添加一个标示锁的字段,每次操作前,先通过update这个锁字段来完成类似竞争锁的操作,操作完成后在update锁字段复位,标示已归还锁。这种方式比较安全,不好的地方在于这些update锁字段的操作就是额外的性能消耗

统一触发途径

当一个数据可能会被多个触发点或多个业务涉及到,就有并发问题产生的隐患,因此可以通过前期架构和业务设计,尽量统一触发途径,触发途径少了一是减少并发的可能,也有利于对于并发问题的分析和判断。

相关文章

  • 分布式环境下,怎么保证线程安全

    转载来源:探索并发编程(七)------分布式环境中并发问题 避免并发 在分布式环境中,如果存在并发问题,那么很难...

  • 什么是线程安全?如何保证线程安全?基本特征

    什么是线程安全?   线程安全是一个多线程环境下正确性的概念,也就是保证多线程环境下共享的、可修改的状态的正确性,...

  • Redis分布式锁

    分布式场景线程安全问题 1、在单体的应用开发场景中,在多线程的环境下,涉及并发同步的时候,为了保证一个代码块在同一...

  • 基于redis简单的分布式锁实现思路

    基于分布式系统,Java提供的内置锁(synchronized和AQS Lock)无法满足在分布式环境下保证线程的...

  • 并发编程

    1、什么是线程安全,怎么保证线程安全? 线程安全可以简单理解为一个方法或者一个实例可以在多线程环境中使用而不会出现...

  • 分布式锁之Redis实现

    分布式锁 单机环境下,为解决多线程访问共享资源产生的线程安全问题,引入了锁机制。分布式环境下,多个服务实例也存在对...

  • ThreadLocal分析其弱引用和可能引起的内存泄漏

    ThreadLocal大家都不陌生,字面意思是线程本地副本,可在多线程环境下,为每个线程创建独立的副本保证线程安全...

  • 分布式管理之分布式锁

    前言 在单机多线程下,对某个资源并发操作时,我们通常会用锁来保证资源的安全性,在分布式环境下,或者说多个进程同时操...

  • 通过自定义注解对方法加锁

    多线程环境下,会出现线程不安全的问题,所以要对某些方法加锁以保证线程安全。常用的方法有: 但是如果方法过多,每个方...

  • ThreadLocal

    一、ThreadLocal简介 ThreadLocal是在并发编程的多线程环境下用来保证变量线程安全的工具类,其基...

网友评论

    本文标题:分布式环境下,怎么保证线程安全

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