jdk1.7和jdk1.8的区别是什么-LMLPHP

jdk1.7与jdk1.8对比

1. jdk1.7语法上

1) 可以用二进制来表示整数,用0b开头。

2) Switch语句支持string类型

3) try块可以不用finally手动关闭,直接try块中就可以关闭

4) Catch多个异常 说明:Catch异常类型为final所以不能被修改。这一特性将生成更少的字节码并减少代码冗余。重新抛异常时保持异常类型。

5) 可在数字中使用下划线,更加友好。但要注意下划线添加规则,下划线只能在数字之间,在数字的开始或结束一定不能使用下划线。

6) 创建泛型实例时,会根据变量声明时的泛型类型自动推断出实例的泛型类型。

7) 在可变参数方法中传递非具体化参数,改进编译警告和错误。

8) 信息更丰富的回溯追踪。

2. NIO2的一些新特性

1) 实现了异步非阻塞IO和Proactor

2) 递归查找文件树,文件扩展搜索

3. Jdbc

1) 可以使用try-with-resources自动关闭Connection, ResultSet,和 Statement资源对象。

2) RowSet1.1(接口模型):引入RowSetFactory接口和RowSetProvider类,可以创建JDBC driver支持的各种 row sets,这里的rowset实现其实就是将sql语句上的一些操作转为方法的操作,封装了一些功能。

3) JDBC-ODBC驱动会在jdk8中删除。

4. 并发工具增强

1) fork-join,Fork/Join框架是Java7提供了的一个用于并行执行任务的框架, 是一个把大任务分割成若干个小任务,最终汇总每个小任务结果后得到大任务结果的框架。(充分利用多核特性,将大问题分解成各个子问题,由多个cpu可以同时解决多个子问题,最后合并结果)。

2) ThreadLocalRandon并发下随机数生成类,保证并发下的随机数生成的线程安全,实际上就是使用threadlocal。

3) phaser类

java5有一个并发包。里面有semaphore(信号量)、CountDownLatch(闭锁)、CyclicBarrier(栅栏)。phaser 类优化了CountDownLatch和CyclicBarrier。

信号量:信号量就是可以声明多把锁(包括一把锁:此时为互斥信号量)。

举个例子:一个房间如果只能容纳5个人,多出来的人必须在门外面等着。如何去做呢?一个解决办法就是:房间外面挂着五把钥匙,每进去一个人就取走一把钥匙,没有钥匙的不能进入该房间而是在外面等待。每出来一个人就把钥匙放回原处以方便别人再次进入。

jdk1.7和jdk1.8的区别是什么-LMLPHP

主要用来控制能够访问的最大线程数。默认是非公平的。可以通过构造器显示声明锁的公平性。

闭锁:

含义:CountDownLatch可以理解为一个计数器在初始化时设置初始值,当一个线程需要等待某些操作先完成时,需要调用await()方法。这个方法让线程进入休眠状态直到等待的所有线程都执行完成。每调用一次countDown()方法内部计数器减1,直到计数器为0时唤醒。这个可以理解为特殊的CyclicBarrier。线程同步点比较特殊,为内部计数器值为0时开始。

方法:核心方法两个:countDown()和await()。countDown():使CountDownLatch维护的内部计数器减1,每个被等待的线程完成的时候调用。

await():线程在执行到CountDownLatch的时候会将此线程置于休眠

例子:开会的例子:会议室里等与会人员到齐了会议才能开始。

栅栏:

含义:栅栏允许两个或者多个线程在某个集合点同步。当一个线程到达集合点时,它将调用await()方法等待其它的线程。线程调用await()方法后,CyclicBarrier将阻塞这个线程并将它置入休眠状态等待其它线程的到来。等最后一个线程调用await()方法时,CyclicBarrier将唤醒所有等待的线程然后这些线程将继续执行。CyclicBarrier可以传入另一个Runnable对象作为初始化参数。当所有的线程都到达集合点后,CyclicBarrier类将Runnable对象作为线程执行。

方法:await():使线程置入休眠直到最后一个线程的到来之后唤醒所有休眠的线程。

与CountDownLatch的区别:

在所有线程到达集合点后接受一个Runnable类型的对象作为后续的执行

没有显示调用CountDown()方法

CountDownLatch一般只能使用一次,CyclicBarrier可以多次使用

应用场景:多个线程做任务,等到达集合点同步后交给后面的线程做汇总。

Phaser:

含义:更加复杂和强大的同步辅助类。它允许并发执行多阶段任务。当我们有并发任务并且需要分解成几步执行时,(CyclicBarrier是分成两步),就可以选择使用Phaser。Phaser类机制是在每一步结束的位置对线程进行同步,当所有的线程都完成了这一步,才允许执行下一步。跟其他同步工具一样,必须对Phaser类中参与同步操作的任务数进行初始化,不同的是,可以动态的增加或者减少任务数。

函数:arriveAndAwaitAdvance():类似于CyclicBarrier的await()方法,等待其它线程都到来之后同步继续执行。arriveAndDeregister():把执行到此的线程从Phaser中注销掉。isTerminated():判断Phaser是否终止。register():将一个新的参与者注册到Phaser中,这个新的参与者将被当成没有执行完本阶段的线程。forceTermination():强制Phaser进入终止态

例子:使用Phaser类同步三个并发任务。这三个任务将在三个不同的文件夹及其子文件夹中查找过去24小时内修改过扩展为.log的文件。这个任务分成以下三个步骤:查找文件、过滤文件、打印结果。并且在查找文件和过滤文件结束后对结果进行分析,如果是空的,将此线程从Phaser中注销掉。也就是说,下一阶段,该线程将不参与运行。在run()方法中,开头调用了phaser的arriveAndAwaitAdvance()方法来保证所有线程都启动了之后再开始查找文件。在查找文件和过滤文件阶段结束之后,都对结果进行了处理。即:如果结果是空的,那么就把该条线程移除,如果不空,那么等待该阶段所有线程都执行完该步骤之后在统一执行下一步。最后,任务执行完后,把Phaser中的线程均注销掉。

Phaser其实有两个状态:活跃态和终止态。当存在参与同步的线程时,Phaser就是活跃的。并且在每个阶段结束的时候同步。当所有参与同步的线程都取消注册的时候,Phase就处于终止状态。在这种状态下,Phaser没有任务参与者。

Phaser主要功能就是执行多阶段任务,并保证每个阶段点的线程同步。在每个阶段点还可以条件或者移除参与者。主要涉及方法arriveAndAwaitAdvance()和register()和arriveAndDeregister()。

4) Networking增强

新增URLClassLoader close方法,可以及时关闭资源,后续重新加载class文件时不会导致资源被占用或者无法释放问题。

5) MultithreadedCustom Class Loaders

解决并发下加载class可能导致的死锁问题,这个是jdk1.6的一些新版本就解决了,jdk7也做了一些优化。

Java1.8

1. 接口的默认方法

Java1.8以前,接口里的方法要求全部是抽象方法,java 8允许我们给接口添加一个非抽象的方法实现,只需要使用 default关键字即可。

2. lambda表达式

它将允许我们将行为传到函数里。在Java 8之前,如果想将行为传入函数,仅有的选择就是匿名类,需要6行代码。而定义行为最重要的那行代码,却混在中间不够突出。Lambda表达式取代了匿名类,取消了模板,允许用函数式风格编写代码。这样有时可读性更好,表达更清晰。

3. 函数式接口

如果一个接口定义个唯一一个抽象方法,那么这个接口就成为函数式接口。一个函数式接口非常有价值的属性就是他们能够用lambdas来实例化。

4. 方法与构造函数引用

使用关键字来传递方法或者构造函数引用。

5. Lambda作用域

在lambda表达式中访问外层作用域和老版本的匿名对象中的方式很相似。你可以直接访问标记了final的外层局部变量,或者实例的字段以及静态变量。

6. 访问局部变量

可以直接在lambda表达式中访问外层的局部变量。

7. 访问对象字段与静态变量

和本地变量不同的是,lambda内部对于实例的字段以及静态变量是即可读又可写。该行为和匿名对象是一致的。

8. 访问接口的默认方法

JDK1.8 API包含了很多内建的函数式接口,在老Java中常用到的比如Comparator或者Runnable接口,这些接口都增加了注解以便能用在lambda上。

Java 8API同样还提供了很多全新的函数式接口来让工作更加方便,有一些接口是来自Google Guava库里的,即便你对这些很熟悉了,还是有必要看看这些是如何扩展到lambda上使用的。

想要查阅更多相关文章,请访问Work网!!

以上就是jdk1.7和jdk1.8的区别是什么的详细内容,更多请关注Work网其它相关文章!

08-31 08:33