Java8新特性学习
函数式接口
什么是函数式接口
- 只包含一个抽象方法的接口,称为函数式接口。
- 可以通过 Lambda 表达式来创建该接口的实现类。
函数式接口只会有一个抽象方法,default方法不属于抽象方法,接口重写了Object的公共方法也不算入内,所以Comparator是函数式接口。
Java内置函数式接口
四大核心接口
接口名 | 参数类型 | 返回类型 | 用途 |
---|---|---|---|
Consumer<T> 消费型接口 | T | void | void accept(T t); 适合“传递参数没有返回值”的场景 |
Supplier<T> 供给型接口 | 无 | T | T get(); 适合“没有参数有返回值”的场景 |
Function<T,R> 函数型接口 | T | R | R apply(T t); 适合“传递参数有返回值”的场景 |
Predicate<T> 断定型接口 | T | boolean | boolean test(T t); 适合“传递参数返回boolean值”的场景 |
Java程序猿搬砖笔记(十)
synchronized锁定的对象
synchronized修饰的作用:
让多个线程排队依次获取某个资源,保证数据不会出错(原子性)。
synchronized锁定的元素:
- 修饰方法
- 静态方法,锁定的是类
- 普通方法,锁定的时方法的调用者
- 修饰代码块,锁定的时传入的对象
Java线程内存模型(JMM)定义的8中原子操作
- read(读取):从主内存中读取数据
- load(载入):将主内存读取到的数据写入工作内存
- use(使用):从工作内存读取数据来计算
- assgin(赋值):将计算好的值重新赋值到工作内存中
- store(存储):将工作内存数据写入主内存,会经过总线,到总线后就开始广播其他线程
- write(写入):将store过去的变量值赋值给主内存中的变量
- lock(锁定):将主内存变量加锁,标识为线程独占状态
- unlock(解锁):将主内存变量解锁,解锁后其他线程可以锁定该变量
MESI缓存一致性协议:
多个cpu从主内存读取同一个数据到各自的高速缓存,当其中某个cpu修改了缓存里的数据,该数据会马上同步回主内存,其他cpu通过总线嗅探机制可以感知到数据的变化从而将自己缓存里的数据失效。
一般lock锁加在线程的赋值之后,存储之前,这样的锁的粒度不大。volatile保证数据可见性、synchronized保证原子性。