Optional类是Java 8中引入的一个新特性,主要目的是为了避免空指针异常(NullPointerException)。它是一个可以为null的容器对象。如果值存在则isPresent()方法会返回true,调用get()方法会返回该对象。
在传统的Java编程中,我们经常需要对返回的对象进行非空检查,以防止出现NullPointerException。这种情况下,代码可能会变得冗长且易出错。例如,一个方法可能返回一个可选的对象,如果没有找到结果,就返回null。使用Optional类后,我们可以更清晰地表达方法可能无法返回有效值的情况,并强制调用者显式处理这种情况。
Optional类提供了多种方法来安全地访问和操作其内部封装的对象,如orElse(), orElseGet(), ifPresent()等,这使得编写更健壮、更具可读性的代码成为可能。
总结一下,Optional类解决的主要问题是:
-
提高了代码的安全性,避免空指针异常。
-
提高了代码的可读性和表达力,使空值情况处理更加明确。
-
鼓励开发者采用更明确的方式来处理可能为空的结果,减少潜在的bug。
Java内存模型(Java Memory Model,JMM)是Java语言规范的一部分,它定义了在多线程环境中,如何在共享内存系统中处理对变量的访问,确保不同线程间的交互行为能够保持一致性和正确性。具体来说,JMM关注以下几个核心概念和目标:
-
可见性:
- 当一个线程修改了一个共享变量后,其他线程能确保看到这个修改。JMM通过强制使用特定的同步原语(如
synchronized
块或volatile
变量)来确保这种可见性。
- 当一个线程修改了一个共享变量后,其他线程能确保看到这个修改。JMM通过强制使用特定的同步原语(如
-
原子性:
- 某些操作必须被视为不可分割的整体,即使在多线程环境下也不能被中断。Java中的
synchronized
和volatile
关键字提供了原子性保证。
- 某些操作必须被视为不可分割的整体,即使在多线程环境下也不能被中断。Java中的
-
有序性:
- 程序中的指令执行顺序在并发环境下可能受到编译器优化、处理器重新排序等因素的影响。JMM通过禁止特定类型的指令重排序来确保必要的有序性。
在实际的计算机系统中,由于现代处理器存在多级缓存、乱序执行等特点,不加控制的并发操作可能导致数据不一致或错误的结果。为了解决这些问题,JMM采用了以下策略:
-
内存屏障(Memory Barrier):
- 内存屏障是一种用于阻止特定类型指令重排序的技术,它可以确保某些操作在特定时刻之前或之后完成,并且其结果对所有线程可见。
-
** volatile 变量规则**:
volatile
关键字确保每次访问都直接从主内存中读取,并在写入后立即刷新到主内存,这样其他线程就可以看到最新值。
-
锁和同步:
synchronized
关键字确保同一时刻只有一个线程可以进入临界区,并且当一个线程退出同步代码块时,所做的更改对后续进入该区域的线程可见。
总之,Java内存模型提供了一种抽象机制,使得Java程序员无需深入了解底层硬件和操作系统的内存管理细节,也能编写出正确、可靠的并发代码。通过规范线程间变量访问的行为,JMM确保了Java程序在多种平台上表现出一致的内存访问行为。
Java有四种访问权限修饰符:
-
public:公开访问,对所有类可见。
-
protected:受保护访问,对同一包内的类和所有子类可见。
-
private:私有访问,只对定义它的类自身可见。
-
default:默认访问(没有明确指定访问修饰符),仅对同一包内的类可见。
这四种访问修饰符用于控制类、接口、字段(变量)和方法的访问级别。