1.synchronized和Lock的区别是什么?
来自Java- 技术专题 -Synchronized 和 lock 区别
1.lock 是一个接口,而 synchronized 是 Java 的一个关键字,synchronized 是内置的语言实现。
2. 异常是否释放锁:synchronized 在发生异常时候会自动释放占有的锁,因此不会出现死锁;而 lock 发生异常时候,不会主动释放占有的锁,必须手动 unlock 来释放锁,可能引起死锁的发生。(所以最好将同步代码块用 try catch 包起来,finally 中写入 unlock,避免死锁的发生。)
3.是否响应中断:lock 等待锁过程中可以用 interrupt 来中断等待,而 synchronized 只能等待锁的释放,不能响应中断。
4. 是否知道获取锁:Lock 可以通过 trylock 来知道有没有获取锁,而 synchronized 不能。
5. Lock 可以提高多个线程进行读操作的效率。(可以通过 ReadWriteLock 实现读写分离)
6.在性能上来说,如果竞争资源不激烈,两者的性能是差不多的,而当竞争资源非常激烈时(即有大量线程同时竞争),此时 Lock 的性能要远远优于 synchronized。所以说,在具体使用时要根据适当情况选择。
7.synchronized 使用 Object 对象本身的 wait 、notify、notifyAll 调度机制,而 Lock 可以使用 Condition 进行线程之间的调度。
2.JDK8新特性
Java 8是Java语言的一次重要更新,它引入了许多新特性,使得编写代码更加简洁、易于维护且功能更强大。以下是Java 8的主要新特性:
- Lambda表达式:
Lambda表达式是Java 8最重要的特性之一,它提供了一种简洁的方式来表示匿名函数。
语法:(parameters) -> expression 或者 (parameters) -> { statements; }。
Lambda表达式通常与函数式接口一起使用,使得代码更加简洁和易读。 - 函数式接口:
函数式接口是只有一个抽象方法的接口。
Java 8中引入了@FunctionalInterface注解来显式声明函数式接口。
这使得Lambda表达式可以方便地实现这些接口。 - 方法引用:
方法引用是Lambda表达式的一种简写形式,可以直接引用现有的方法。
语法:ClassName::methodName。
方法引用使得代码更加简洁,并提高了可读性。 - Stream API:
Stream API提供了一种功能强大的操作集合数据的新方式。
它支持顺序流和并行流,可以轻松实现过滤、排序、映射和减少等操作。
Stream API使得集合操作更加高效和易于理解。 - 接口运行定义默认方法和静态方法:
Java 8允许在接口中定义默认方法静态方法,即带有实现的接口方法。
这使得接口的演化更加灵活,而无需破坏现有的实现。 - Optional类:
Optional类是Java 8中引入的一个非常有用的工具,用于处理可能为null的值。
它的主要目的是减少空指针异常(NullPointerException),使得代码更加健壮和可读。
Optional类提供了多种方法来处理可能为null的值,如isPresent()、isEmpty()、get()、orElse()等。 - 新的日期和时间API:
Java 8引入了新的日期和时间API,包括LocalDate、LocalTime、LocalDateTime、Instant、Duration以及Period等类。
新的API比之前的Date类更加丰富和功能齐全,解决了之前Date类转化时的线程安全问题。 - 重复注解与类型注解:
Java 8支持重复注解,即允许在同一个元素上多次使用相同的注解。
同时,Java 8也引入了类型注解,允许在类型上使用注解,如方法返回类型、字段类型等。 - JVM改进:
Java 8对JVM进行了一些改进,如移除了永久代(PermGen),加入了元数据区(Metaspace)等。
这些改进有助于提升Java应用的性能和稳定性。