构建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 块里面

- 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


欢迎关注本站公众号,获取更多信息