zoukankan      html  css  js  c++  java
  • java 并发线程锁

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

       异步,执行完函数或方法后,不必阻塞性地等待返回值或消息,只需要向系统委托一个异步过程,那么当系统接收到返回

            值或消息时,系统会自动触发委托的异步过程,从而完成一个完整的流程。

            同步在一定程度上可以看做是单线程,这个线程请求一个方法后就待这个方法给他回复,否则他不往下执行(死心眼)。

    2、如何处理并发和同步

      一种是代码层次上的,如java中的同步锁,典型的就是同步关键字synchronized,这里我不在做过多的讲解,

           感兴趣的可以参考:http://www.cnblogs.com/xiohao/p/4151408.html

      另外一种是数据库层次上的,比较典型的就是悲观锁和乐观锁。这里我们重点讲解的就是悲观锁(传统的物理锁)和乐观锁。

    悲观锁(Pessimistic Locking):  

      悲观锁的实现,往往依靠数据库提供的锁机制(也只有数据库层提供的锁机制才能 真正保证数据访问的排他性,否则,即使在本系统

           中实现了加锁机制,也无法保证外部系 统不会修改数据)。 

           例如: select * from account where name=”Erica” for update   

        锁定了 account 表中所有符合检索条件( name=”Erica” )的记录

           本次事务提交之前(事务提交时会释放事务过程中的锁),外界无法修改这些记录。 
           Hibernate 的悲观锁,也是基于数据库的锁机制实现。 

        至于是锁住整个表还是锁住选中的行,请参考: http://www.cnblogs.com/xiohao/p/4385768.html

    乐观锁(Optimistic Locking):        
             相对悲观锁而言,乐观锁机制采取了更加宽松的加锁机制。悲观锁大多数情况下依 靠数据库的锁机制实现,以保证操作最大程度的独占性。但随之

       而来的就是数据库 性能的大量开销,特别是对长事务而言,这样的开销往往无法承受。

         乐观锁,大多是基于数据版本   Version )记录机制实现。

    4、常见的提高高并发下访问的效率的手段

        根据不同的情况,解决思路也不同。

    1. 像第一种情况可以增加网络带宽,DNS域名解析分发多台服务器。

    2. 负载均衡,前置代理服务器nginx、apache等等

    3. 数据库查询优化,读写分离,分表等等

    最后复制一些在高并发下面需要常常需要处理的内容:

    • 尽量使用缓存,包括用户缓存,信息缓存等,多花点内存来做缓存,可以大量减少与数据库的交互,提高性能。

    • 用jprofiler等工具找出性能瓶颈,减少额外的开销。

    • 优化数据库查询语句,减少直接使用hibernate等工具的直接生成语句(仅耗时较长的查询做优化)。

    • 优化数据库结构,多做索引,提高查询效率。

    • 统计的功能尽量做缓存,或按每天一统计或定时统计相关报表,避免需要时进行统计的功能。

    • 能使用静态页面的地方尽量使用,减少容器的解析(尽量将动态内容生成静态html来显示)。

    • 解决以上问题后,使用服务器集群来解决单台的瓶颈问题。

    并发解决思路

    1、采用分布式应用设计
    2、分布式缓存数据库
    3、代码优化

    https://www.cnblogs.com/lr393993507/p/5909804.html

  • 相关阅读:
    1、常见ELK架构工作流程
    centos7系统zabbix 4.4版本升级到5.0版本
    K3s简介(一)
    三、saltstack数据系统grains
    爬取猫眼电影top100信息
    第一次爬虫实例
    docker容器轻量级web管理工具之portainer(六)
    liunx添加swap分区
    iptables 配置详解
    几个比较经典的算法问题的java实现
  • 原文地址:https://www.cnblogs.com/ch94/p/10103422.html
Copyright © 2011-2022 走看看