(60)jdk1.8有什么新特性?
1.接口的默认方法
Java 8允许我们给接口添加一个非抽象的方法实现,只需要使用 default关键字即可,这个特征又叫做扩展方法,
2.Lambda 表达式
3.函数式接口:“函数式接口”是指仅仅只包含一个抽象方法的接口,每一个该类型的lambda表达式都会被匹配到这个抽象方法。因为 默认方法 不算抽象方法,所以你也可以给你的函数式接口添加默认方法。
4.Java 8 允许你使用 :: 关键字来传递方法或者构造函数引用
5.Lambda 作用域:在lambda表达式中访问外层作用域和老版本的匿名对象中的方式很相似。你可以直接访问标记了final的外层局部变量,
或者实例的字段以及静态变量。
6.访问局部变量:可以直接在lambda表达式中访问外层的局部变量
7.访问对象字段与静态变量
和本地变量不同的是,lambda内部对于实例的字段以及静态变量是即可读又可写。该行为和匿名对象是一致的
8.访问接口的默认方法
9.Date API:Java 8 在包java.time下包含了一组全新的时间日期API。
10.Annotation 注解:Java 8允许我们把同一个类型的注解使用多次,只需要给该注解标注一下@Repeatable即可。

(61)timer
Java中Util包提供的定时器类。简单来说,它能让程序在指定的时间开始执行某些特定功能,也能让特定功能按照指定的周期循环执行。
Timer timer = new Timer();
timer.schedule(TimerTask task,Date firstTime,Long period):安排指定的任务在指定的时间开始进行重复的固定延迟执行。
(62)solr
1.创建索引库
2.安装IK分词器,创建索引域类型,创建域字段
3.必须配置索引域、复制域、动态域字段
4.配置solr服务器地址
5.solr模板:spring-data-solr,solrTempalte.saveBean
(63)用到哪几种锁?
1.共享锁/排它锁:共享锁和排他锁是从同一时刻是否允许多个线程持有该锁的角度来划分。
共享锁允许同一时刻多个线程进入持有锁,访问临界区资源。而排他锁就是通常意义上的锁,同一时刻只允许一个线程访问临界资源。对于共享锁,主要是指对数据库读操作中的读锁,在读写资源的时候如果没有线程持有写锁和请求写锁,则此时允许多个线程持有读锁。
2.悲观锁/乐观锁:主要用于数据库数据的操作中,而对于线程锁中较为少见。
对于乐观锁,在进行数据读取的时候不会加锁,而在进行写入操作的时候会判断一下数据是否被其它线程修改过,如果修改则更新数据,如果没有则继续进行数据写入操作。乐观锁不是系统中自带的锁,而是一种数据读取写入思想。应用场景例如:在向数据库中插入数据的时候,先从数据库中读取记录修改版本标识字段,如果该字段没有发生变化(没有其他线程对数据进行写操作)则执行写入操作,如果发生变化则重新计算数据。
对于悲观锁,无论是进行读操作还是进行写操作都会进行加锁操作。对于悲观锁,如果并发量较大则比较耗费资源,当然保证了数据的安全性。
3.可重入锁/不可重入
这两个概念是从同一个线程在已经持有锁的前提下能否再次持有锁的角度来区分的。
对于可重入锁,如果该线程已经获取到锁且未释放的情况下允许再次获取该锁访问临界区资源。此种情况主要是用在递归调用的情况下和不同的临界区使用相同的锁的情况下。
对于不可重入锁,则不允许同一线程在持有锁的情况下再次获取该锁并访问临界区资源。对于不可重入锁,使用的时候需要小心以免造成死锁。

4.公平锁/非公平锁 这两个概念主要使用线程获取锁的顺序角度来区分的。 对于公平锁,所有等待的线程按照按照请求锁的先后循序分别依次获取锁。 对于非公平锁,等待线程的线程获取锁的顺序和请求的先后不是对应关系。有可能是随机的获取锁,也有可能按照其他策略获取锁,总之不是按照FIFO的顺序获取锁。 在使用ReentrantLock的时候可以通过构造方法主动选择是实现公平锁还是非公平锁。 5.自旋锁/非自旋锁 自旋锁在进行锁请求等待的时候不进行wait挂起,不释放CPU资源,执行while空循环。直至获取锁访问临界区资源。适用于等待锁时间较短的情景,如果等待时间较长,则会耗费大量的CPU资源。而如果等待时间较短则可以节约大量的线程切换资源。 非自旋锁在进行锁等待的时候会释放CPU资源,可以通多sleep wait 或者CPU中断切换上下文,切换该线程。在线程等待时间较长的情况下可以选择此种实现机制。 除此之外还有一种介于两者之间的锁机制——自适应自旋锁。当线程进行等待的时候先进性自旋等待,在自旋一定时间(次数)之后如果依旧没有持有锁则挂起等待。在jvm中synchronized锁已经使用该机制进行处理锁等待的情况。
(责任编辑:admin)