zoukankan      html  css  js  c++  java
  • Java面试题集锦

    MySQL

    事务的隔离级别

    多线程

    线程的生命周期

    • 新建(New)
    • 运行(Runnable)
    • 阻塞(Blocked)
    • 等待(Waiting)
    • 带超时时间的等待(TIMED_WAITING)
    • 终止(TERMINATED)

    多线程中锁有哪几种?

    分布式

    分布式事务

    分布式事务的解决方案

    一、两阶段提交(2PC)

    二、补偿事务(TCC)

    三、本地消息表(异步确保)

    四、MQ事务消息

    分布式锁

    分布式锁的解决方案

    一、基于数据库实现分布式锁
    创建一个表,包含字段有方法名,此字段为唯一索引,获取锁时,向数据表中插入一条数据,方法名字段保存请求的方法,插入成功,则代表获取锁成功,插入失败,代表获取锁失败。方法执行完成后,把当前表中的那条数据删除掉,代表着释放锁,其它的线程可以重新获取锁。
    缺点:当某一个服务宕机,数据库中的数据没有删除,锁就不会被释放,其它线程就不能够重新获得到锁。
    解决方法:可以写一个定时任务,删除数据库中的数据。

    在查询select语句中,可以用for update来锁定当前行的数据,为排它锁。

    二、基于缓存实现分布式锁
    可以使用Redis中的SETNX命令

    SETNX key value
    

    插入数据时,如果数据未存在,插入成功返回1,如果数据存在,不做任何操作,返回0
    分布式方法调用时,调用SETNX,key可以定义为方法名,用UUID成功随机数代替value,SETNX命令返回1,说明当前方法获得到锁,其它方法等待。当方法执行结束,删除key的值。
    缺点:当某一个服务宕机,redis中的key的值没有删除,锁就不会被释放。
    解决方法:在SETNX值时,指定过期时间

    三、基于Zookeeper实现分布式锁

    分布式接口重复请求问题?

  • 相关阅读:
    巴洛克式和哥特式的区别
    推荐阅读书籍,是时候再行动起来了。
    AtCoder ABC 159F Knapsack for All Segments
    AtCoder ABC 159E Dividing Chocolate
    AtCoder ABC 158F Removing Robots
    AtCoder ABC 158E Divisible Substring
    AtCoder ABC 157F Yakiniku Optimization Problem
    AtCoder ABC 157E Simple String Queries
    AtCoder ABC 157D Friend Suggestions
    AtCoder ABC 156F Modularness
  • 原文地址:https://www.cnblogs.com/loveyous/p/13675975.html
Copyright © 2011-2022 走看看