zoukankan      html  css  js  c++  java
  • Java高并发-概念

    一、为什么需要并行

    业务要求

    • http处理多个客户端请求
    • java虚拟机启动多个线程
    • 进程开销比线程大的多

    性能

    • 多线程在多核系统比单线程要好的多

    摩尔定律失效

    二、几个重要概念

    2.1 同步和异步

    synchronous,asynchronous

    2.2 并发和并行

    concurrency,parallelism

    2.3 临界区

    临界区用来表示一种公共资源或者说是共享数据,可以被多个线程使用。但是每一次,只能有一个线程使用它,一旦临界区资源被占用,其他线程要想使用这个资源,就必须等待。

    2.4 阻塞和非阻塞

    blocking,non-blocking

    阻塞和非阻塞通常用来形容多线程音的相互影响。比如一个线程占用了临界区资源,那么其它所有需要这个资源的线程就必须在这个临界区中进行等待,等待会导致线程挂起。这种情况就是阻塞。此时,如果占用资源的线程一直不愿意释放资源,那么其它所有阻塞在这个临界区上的线程都不能工作。

    非阻塞允许多个线程同时进入临界区。

    2.5 死锁、饥饿和活锁

    deadlock,starvation,livelock

    死锁:抢占资源而不释放

    饥饿是指某一个或者多个线程因为种种原因无法获得所需要的资源,导致一直无法执行。比如某线程因优先级低获取不到资源。

    活锁:电梯遇人

    2.6 并行的级别

    阻塞:当一个线程进入临界区后,其他线程必须等待

    无障碍(Obstruction-Fee):

    • 无障碍是一种最弱的非阻塞高度
    • 自由出入临界区
    • 无竞争时,有限步内完成操作
    • 有竞争时,回滚数据

    无锁(Lock-Fee):

    • 是无障碍的
    • 保证有一个线程可以胜出
    // 典型的无锁代码
    while(!atomicVar.compareAndSet(localVar, localVar+1)) {
        localVar = atomicVar.get();
    }
    

    无等待(Wait-Free):

    • 无锁的
    • 要求所有的线程都必须在有限步内完成
    • 无饥饿的

    三、2个重要的定理

    3.1 Amdahl定律(阿姆达定律)

    3.2 Gustafson定律(古斯塔夫森)

  • 相关阅读:
    在mysql数据库中制作千万级测试表
    Oracle生成千万测试数据
    mysql ODBC 在64位下提示找不到odbc驱动问题
    mysql指定某行或者某列的排序
    Python_Openpyxl 浅谈(最全总结 足够初次使用)
    Python3 多线程
    python爬虫项目-一见倾心壁纸
    gisoracle做windows界面
    Python 画 直方图/条形图/柱状图
    做动画animation--matplotlib--python2和3通用代码
  • 原文地址:https://www.cnblogs.com/okokabcd/p/8720941.html
Copyright © 2011-2022 走看看