构建Java 中间件基础知识

中间件java

  • 软件胶水
  • 不是操做系统、不是数据库管理系统、不是软件应用一部分,
  • 而是让软件开发者方便处理通讯、输入和输出、专一业务应用部分
  • 桥梁做用

三个领域的中间件数据库

  • 远程过程调用和对象访问中间件
    • 分布式环境下应用的互相访问
    • 应用服务化的基础
  • 消息中间件
    • 解决应用之间消息传递、解耦、异步的的问题
  • 数据访问中间件
    • 解决访问数据库的共性问题的组件

  • 使用线程池、使用有固定上限的线程池
    • 线程建立消耗很大
  • synchronized
    • 使用修饰代码块的方式比较灵活,直接修饰方法不灵活
    • 互斥效果
    • 同步本地线程变量值和主存一致
  • ReentrantLock(重入锁)
    • 用法相似synchronized,不过须要显式 unlock
    • 引入缘由:
      • 提供了tryLock 方法
        • 返回false表明锁被其余线程持有,不能获取;
        • true表明没被其余线程持有,获取成功。
      • 构建ReentrantLock 时,有一个构造函数参数是Boolean 类型
        • 描述锁公平与否,
        • 公平锁严格排队(效率低一些);
        • 非公平锁抢占式(效率高点)
  • ReentrantLock 提供了ReentrantReadWriteLock 
    • 主要用于读多写少,而且读不须要互斥的场景
    • 这样使用读写锁会比所有互斥的锁性能高不少
  • volatile
    • 保证了所修饰变量的可见性
    • 轻量级实现变量可见性的方法
    • 更多修饰开关状态的变量(取值不会使用本地线程副本)
  • 以下图(在读的层面)
    • i3  synchronized 关键词,保证了本地线程副本与主存同步,也是最新的
    • i2 取值不会使用本地线程副本,是最新的
    • i1 可能不是最新的

  • 以下图,在写的层面
    • i1 设置后会当即获得最新值,其余线程不必定
    • i2 volatile 保证变量仅仅在主存保存一份,其余线程当即能看到最新值
    • i3  synchronized 关键字,会把本地副本同步到主存,可是别的线程查看不必定和主存一致(除非也加上synchronized ,先同步本地副本和组从在读取)

  • volatile 仅仅保证可见性,put 不是线程安全的
    • 因此多线程下面代码最后的 count 可能会大于100
    • 加上synchronized  轻松搞定

  • Atomics包
    • 提供一些原子操做 
    • 与本身手动同步相比,使用简单线程安全,性能高不少
    • 性能高不少的缘由是使用了硬件支持的指令

  • wait、notify、notifyAll 使用时必须放在synchronized 块里面
    • 实际应用中,wait外面套循环,防止虚假唤醒

  • CountDownLatch
    • 等全部都执行完countDown后,wait才会被唤醒
    • countDown执行完countDown ,该线程不会阻塞,而是继续本身的工做

  • CyclicBarrier(字面意思:循环屏障、栅栏)
    • 等全部线程都到达await,一块儿开始执行
    • 也就是说提早到达await的线程会阻塞在这里
      • 所以使用时请当心,线程池小的话,很容易死锁
    • 每一个线程都带一个await,循环外也带一个await,因此是count+1个
  • CountDownLatch 不能循环使用 CyclicBarrier 能够

  • Semaphore用于管理信号量,构造时传入可供管理信号量数量
    • 若是管理的信号量数量为1,Semaphore退化为互斥锁
      • 大于1 的时候,主要用于控制最大并发数,超过最大并发量就阻塞等待并发量降下来在执行
    • 执行前acquire方法 获取信号量(获取不到就会阻塞),release 释放
    • acquire 和release 能够带参数,参数的含义就是获取、返还信号量个数

  • ExChanger 用于两个线程之间进行数据交换
    • 线程会阻塞在ExChanger 的exchange 方法,直到另外一个线程也执行到同一个ExChanger 的exchange 方法
    • 两者进行交换,而后继续执行本身的方法

  • Future(接口) 和 FutureTask(具体实现类)

并发容器安全

动态代理多线程

反射并发

  • 反射本质是生成动态代理来执行该方法
  • newInstance 建立对象时,必定要有无参构造函数,不然会抛异常
  • 字节码加强
    • Javassist
    • cglib
    • asm
      • ASM是一个java字节码操纵框架,它能被用来动态生成类或者加强既有类的功能。
      • ASM 能够直接产生二进制 class 文件,也能够在类被加载入 Java 虚拟机以前动态改变类行为。
      • Java class 被存储在严格格式定义的 .class文件里,这些类文件拥有足够的元数据来解析类中的全部元素:类名称、方法、属性以及 Java 字节码(指令)。
      • ASM从类文件中读入信息后,可以改变类行为,分析类信息,甚至可以根据用户要求生成新类。
    • bcel

相关文章
相关标签/搜索