zoukankan      html  css  js  c++  java
  • 《java并发编程的艺术》总结

    1.什么是上下文切换

      CPU通过时间片分配算法来循环执行任务,任务从保存状态到再加载的过程就是一次上下文切换;

     2.死锁的问题

       synchronized(A) {

          ynchronized(B){

          }

      }

    3.Java通过锁和循环CAS操作(CPU缓存回写主内存)的方式实现原子操作,synchronized通过对象锁,对象头mark word 保存锁信息

    4.锁状态,无锁状态,偏向锁,轻量级锁(需要通过cas操作,自旋),重量级锁阻塞(),ABA问题

    5.H-B规则,顺序规则,锁规则,volatile规则 传递性,start,join规则

    6.volatile 可见性,单个变量的原子性,不能重排序

    7.单例模式,双重检查锁定,和延迟初始化

    public class DoubleCheckedLocking{

      private static Instance instance;

      public static Instance getInstance(){

      if(instance == null){

        synchronized(DoubleCheckedLocking.class){

        if(instance ==null) 

          instance = new Instance(); 指针赋值,初始化,重排序导致对象可能还没初始化}}}}

    (1)instance变量增加volatile关键字,基于类初始化

    public class InstanceFactory{

      private static class instanceHolder{

      public static Instance instance = new Instance();}

      public static Instance getInstance(){

      return InstanceHoder.instance;}

    }

    8.进入等待状态的线程需要其它线程的通知才能返回到就绪状态,Thread.join(long) wait sleep

    9.运行,就绪 等待 阻塞,Object.wait() Thread.join LockSupport.park(),Thread.yield() Oject.notify

    10.jVM检查中断的线程,先将线程的中断标识消除,并抛出InterruptedException

    11.同步器,(lock)同步队列,等待队列(wait),到同步队列(notify)

    12.threadlocal,线程本地变量,每个线程都有个threadlocalMap的变量,以threadlocal对象为键,任何对象为值的存储结构

    13.同步器维护一个同步队列,获取状态失败的线程都会被加入到队列中并在队列中进行自旋;移除队列的条件是前驱节点为头结点且成功获取了同步状态,在释放同步状态时,

    同步器会调用 tryrelease 释放同步状态,然后唤醒头结点的后继节点

    14.await 同步队列首节点移到condition的等待队列,加入等待队列+释放锁,等待通知,

    signal 等待队列首节点加入到同步队列,唤醒该节点邸的线程

    15.CHM segments (segment 有reentrantLock)长度为2的N次方,通过按位与的hash算法定位segments数组

     get 过程不需要加锁,除非督导值为null,才加锁重读,每个hashEntry里面的value 都有volatile修饰

     和hashmap扩容的时机不一样

    16.concurrentLinkedQueue tail节点并不总是尾节点,通过hops变量,介绍cas更新tail节点的次数,

    本质上增加对volatile变量的读来减少对volatile变量的写

    17.synchronousQueue 不存储元素的阻塞队列,吞吐量高于Array linked

    18.threadpoolExecutor Worker corePoolSize MaximumPoolSize 线程工厂 拒绝策略(默认抛出异常)keepalive blockingqueue

    19.executor newFixedThreadPool(LK) newSingleThreadExecutor(lk) newCachedThreadPool(SQ) newScheduledThreadPool(执行周期性任务)

    20.futureTask get run cancel,  未启动,启动(run) 已完成,ExecutorService.submit(..)返回futureTask

  • 相关阅读:
    在jQuery ajax中按钮button和submit的区别分析
    jQuery学习-打字游戏
    AndroidManifest.xml权限大全
    判断数据连接----小程序
    ADB常用的几个命令
    Android的ADB配置环境和adb指令使用
    读懂Android项目结构目录
    Android四大组件
    多态继承
    匿名内部类
  • 原文地址:https://www.cnblogs.com/lelouchKOP/p/6629626.html
Copyright © 2011-2022 走看看