1. Java有什么新特性
- Java语言
- 编译器
- 类库
- 工具
- Java运行时
1. 1 Java语言
- Lambda表达式(闭包)允许把函数作为一个方法的参数,或者把代码看成数据。
Arrays.asList("a","b","d").forEach(e->System.out.println(e));
Arrays.asList( "a", "b", "d" ).forEach( e -> {
System.out.print( e );
System.out.print( e );
} );
Arrays.asList( "a", "b", "d" ).sort( ( e1, e2 ) -> e1.compareTo( e2 ) );
- 增加函数式接口,可以被隐式转换为lambda表达式@FunctionInterface,默认方法与静态方法并不影响函数式接口的契约。
- 接口的默认方法与静态方法,所有实现者将会默认继承它(如果有必要的话,可以覆盖这个默认实现)
- 方法引用:构造器引用Class::new(无参),静态方法引用Class::static_method,特定类的任意对象Class::method,特定对象instance::method
- 重复注解
1. 2 Java编译器的新特性
- 参数名字,方便获取参数名字
1. 3 Java类库的新特性
- Optional 一个容器,可以保存类型T的值,或者仅仅保存null,提供有用的方法,这样我们就不用显示进行空值检。如果Optional类的实例为非空值的话,isPresent()返回true,否则返回false,为了防止Optional为空值,orElseGet()方法通过回调函数来产生一个默认值。map()函数对当前Optional的值进行转换,然后返回一个新的Optional实例。
- Stream 真正的函数式变成风格引入到Java中,极大简化了集合框架的处理。
- Date/Time API Clock类,指定时区,获得当前时刻,日期,时间
- parrellelSort()方法,在多核机器上极大提高数组排序速度。
Optional< String > fullName = Optional.ofNullable( null );
System.out.println( "Full Name is set? " + fullName.isPresent() );
System.out.println( "Full Name: " + fullName.orElseGet( () -> "[none]" ) );
System.out.println( fullName.map( s -> "Hey " + s + "!" ).orElse( "Hey Stranger!" ) );
2. synchronized如何实现
- 对象头 Mark
锁就保存在对象头中,对象头分为两部分信息,第一部分用于存储对象自身运行时的数据,如HashCode,GC分代年龄等,另一部分用于存储指向方法区类型数据的指针。
- 偏向锁
偏向锁实际上是一种优化锁,其目的是为了减少数据在无竞争情况下的性能损耗。其核心思想就是锁会偏向第一个获取它的线程,在接下来的执行过程中该锁没有其他的线程获取,则持有偏向锁的线程永远不需要同步。
- 轻量级锁
在没有多线程竞争的前提下,减少传统的重量级锁使用操作系统互斥量产生的性能损耗。
- 自旋锁
sychronized锁是一种重量级锁,在互斥状态下,没有得到锁的线程会被挂起阻塞,而挂起线程和恢复线程的操作都需要转入内核态中完成。所谓自旋锁,就是让没有获得锁的进程自己运行一段时间自循环(默认开启),但是不挂起线程的代价就是该线程会一直占用处理器,如果锁占用的时间很短,自旋等待的效果很好,反之,自旋锁会消耗大量处理器资源,因此,自旋的等待时间必须有一定限度,超过限度还没有获得锁,就要挂起线程。
- 锁的升级过程