多线程和高并发知识梳理

多线程与高并发

线程

什么是线程

  • 进程

    进程相对于可执行程序来说是一个动态概念,比如磁盘上有一个QQ.exe程序,双击运行就是一个进程

  • 线程

    进程是一个运行的程序,线程则是程序不同的执行路径,比如qq包含聊天,浏览空间属于不同的线程

线程创建方式

  • Thread

    通过继承Thread类,重写run方法:
    MyThread myThread = new MyThread()
    myThread.start()

  • Runnable

    继承Runnable 接口
    MyThread{
    }

    new Thread(new MyThread).start()

    相比于继承Thread实现线程创建,通过继承方式有更好的扩展性

  • Callable

    实现Callable接口 重写call方法,call方法有返回值

    new Thread(new FutureTask<String>(new MyCallThread())).start()

线程状态

  • Ready
  • Running
  • Terminated
  • TimedWaiting
  • Waiting
  • Blocked

线程通信

  • Thread

    • wait() 会释放锁,必须在synchronized中使用
    • notify() 不释放锁,必须在synchronized中使用
  • LockSupport

    • park()
    • unpark(t)

volatile

  • 保证可见性

    在线程中,会拷贝变量的副本,修改操作基于副本进行,结束后讲修改结果写回原有变量,线程内的修改对其他线程不可见

    假设有A和B 两个线程和变量C,volitale 修饰C,A线程中对C的修改将会立马作用在变量C上

  • 禁止指令重排

    在程序编译的过程中,可能会对代码进行优化,虽然最终执行结果一样,但是执行顺序可能发生改变,在多线程环境中可能会出错。

  • double check 单例模式需不需要加volatile ?

    需要,如果不加,指令重排可能导致问题。

    public class DoubleCheck {
    private static volatile DoubleCheck INSTANCE;
    private DoubleCheck(){}

    public DoubleCheck getINSTANCE(){
        if(INSTANCE == null){
            synchronized (DoubleCheck.class){
                if(INSTANCE == null) 
                    INSTANCE =  new DoubleCheck();
            }
        }
        return INSTANCE;
    }
    

    }

synchronized

  • 同步锁

    • 锁方法
    • 锁代码块
    • 锁Object
  • 锁升级

    首先加偏向锁(在这个Object的头上面markword记录这个线程,即在第一个线程访问的时候实际上时没有给这个Object加锁的,在内部实现的售后,只是记录这个线程的ID(偏向锁)),
    如果有线程争用的话,就升级为自旋锁,
    自旋锁转10次之后,升级为重量锁,重量所就是去操作心痛哪里申请资源。

  • 重入性

    加锁方法可以调用其他加锁方法,

    如果两个方法存在嵌套调用关系,且持有同一把锁,则内层方法可以直接执行。

CAS

  • compare and swap

    cas(V,Expectded,NewValue){
    if V==E
    V = NEW
    otherwise try again or fail
    }

Atomic类和线程同步新机制

Atomic

  • AtomicInteger AtomicLong
  • LongAdder

新机制

  • ReentranLock

    ReentrantLock 可以替代synchronized是没问题的,也可以重入,是可以锁定的。本身的底层是cas

- lock()
- unlock()
  • CountDownLatch

    • 计数门闩
  • CylicBarrier

    • 循环栅栏
  • Phaser

    • 阶段

      更像是结合了CountDownLatch和CyclicBarrier,

线程池

容器

面试过程中如何聊容器类
可以从两大面开始聊,容器分为两大类Collection,Map,Collection又分为三大类:List Set Queue队列,队列即时一队一队的,往队列里取数据时它和这个List Set 都不一样。大家知道List取得时候如果Array的话还可以取到其中的一个。Set主要和其他的区别就是中间时唯一的,不会有重复元素。Queue实现了一个什么逻辑呢,实际上就是一个队列,队列什么概念,有进有出,那么再这个基础之上,它实现了许多的线程访问方法(比如put阻塞式的放,take阻塞式的取),这个式其他的list set里没有的,队列的最主要原因是为了实现任务的装在的种种取和装这里面最重要的就是叫做阻塞队列,它的实现初衷是为了线程池高并发做准备。

  • Collection

    • List

      • CopyOnWriteList
      • Vector
      • ArrayList
      • LinkedList
    • Set

      • HashSet

        • LinkedHashSet
      • SortedSet

        • TreeSet
      • EnumSet

      • CopyOnWriteArraySet

      • ConcurrentSkipListSet

    • Queue

      Queue和List的区别到底在哪里,主要就是Queue添加了offer peek poll put take这些个对线程友好的或者阻塞或者等待的方法。

    - Dequeue
    - BlockingQueue

        - ArrayBlockingQueue
        - PriorityBlockingQueue
        - LinkedBlockingQueue
        - TransferQueue
        - SynchronousQueue

    - PriorityQueue
    - DelayQueue
  • Map

    • HashMap

      • LinkedHashMap
    • TreeMap

    • WeakHashMap

    • IdentityHashMap

    • ConcurrrentHashMap

    • ConcurrentSkipListMap

阻塞队列

线程池

  • 线程池7大参数

    • 核心线程数

    • 最大线程数

    • 生存时间

    • 生存时间单位

    • 任务任务队列

    • 线程工厂

    • 拒绝策略

      • Abort

        抛异常

    - Discard

      扔掉 不抛异常
      

    - DiscardOldest

      扔掉排队时间最久的
      

    - CallerRuns

      调用者处理服务
      

    - 自定义拒绝策略
  • 原理

    • 分类

      • ThreadPoolExecutor

      • ForkJoinPool

        Fork分叉,分叉完再分叉,最后结果汇总叫join

- ThreadPoolExecutor实现

  Executor接口,接口把线程的定义和执行分开
  ExecutorService实现Executor接口,定义线程池的生命周期方法
  然后才是各种各样的ThreadPoolExecutor : 把线程池作为一个执行单元,给他单独出来一个类
  Executors 是工具类,生成各种线程池

XMind - Trial Version

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 201,468评论 5 473
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,620评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 148,427评论 0 334
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,160评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,197评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,334评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,775评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,444评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,628评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,459评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,508评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,210评论 3 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,767评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,850评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,076评论 1 258
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,627评论 2 348
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,196评论 2 341

推荐阅读更多精彩内容