原子类是指能够保持自身状态的类,具有原子性质,不会被其他线程中断或干扰。在并发编程中,使用原子类能够实现线程安全,避免竞态条件和死锁等问题。
Java中的原子类包括AtomicBoolean
、AtomicInteger
、AtomicLong
、AtomicReference
、AtomicStampedReference
等,它们都提供了原子操作方法,如compareAndSet、incrementAndGet、decrementAndGet等,可以确保操作的原子性和线程安全性。
虽然原子类提供了原子性和线程安全性,但并不保证多个原子操作的组合操作也是原子的。在并发环境下,也需要使用锁和同步机制来保证多个操作的整体原子性。
Java中的原子类提供的这些方法都是线程安全的,不会被其他线程中断或干扰。
get()
:获取当前值set()
:设置当前值lazySet()
:延迟设置当前值。与set()不同的是,它不保证其他线程立即看到修改后的值,而是在可能的情况下延迟更新值,从而提高性能。compareAndSet()
:比较并设置。如果当前值等于预期值(expected),则设置新值(update)并返回true;否则返回false。weakCompareAndSet()
:弱比较并设置。与compareAndSet()类似,但是在一些平台上不保证原子性,因此在可能的情况下也会延迟更新值,从而提高性能。incrementAndGet()
:自增1并返回新值getAndIncrement()
:返回当前值并自增1decrementAndGet()
:自减1并返回新值getAndDecrement()
:返回当前值并自减1addAndGet(int delta)
:增加指定值delta并返回新值getAndAdd(int delta)
:返回当前值并加上指定值deltagetAndSet()
:获取当前值并设置新值。weakCompareAndSetVolatile()
、compareAndExchange()
等,基本与compareAndSet()
类似。虽然原子类提供了原子性和线程安全性,但不保证多个原子操作的组合操作也是原子的。在并发环境下,也需要使用锁和同步机制来保证多个操作的整体原子性。
Java中枚举是一种特殊的数据类型,它允许我们将一组具有相同属性的常量组合在一起并进行管理。枚举的特点有:
values()
: 返回枚举类型的常量数组。valueOf(String name)
: 返回名称为name的枚举常量。name()
: 返回枚举常量的名称。ordinal()
: 返回枚举常量在枚举中定义的顺序。枚举可以用于定义和管理常量集合,这些常量在枚举类型中定义,并可以通过名称或序号进行访问。示例如下:
public enum DayOfWeek {
MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY;
}
在上述示例中,定义了一个DayOfWeek枚举类型的常量集合,它包含星期一到星期日的所有名称常量。我们可以使用以下方式访问这些常量:
DayOfWeek monday = DayOfWeek.MONDAY;
System.out.println(monday);
System.out.println(monday.name());
System.out.println(monday.ordinal());
DayOfWeek[] daysOfWeek = DayOfWeek.values();
for (DayOfWeek day : daysOfWeek) {
System.out.println(day);
}
通过以上代码,我们得到的输出结果为:
MONDAY
MONDAY
0
MONDAY
TUESDAY
WEDNESDAY
THURSDAY
FRIDAY
SATURDAY
SUNDAY
可以看出,可以通过name()
方法获取常量名称,通过ordinal()
方法获取常量在枚举中定义的顺序,并且可以使用values()
方法获取枚举类型的常量数组。
总之,枚举是定义常量集合的一种好方式,可以使代码更加声明式和易于理解。
类加载器是Java虚拟机(JVM)的一部分,它是负责将类的字节码加载到JVM中执行的组件。当使用Java程序时,JVM会在运行时动态地加载类,而类加载器就是实现这个任务的重要组成部分。
类加载的过程分为三个步骤:加载、链接和初始化。当程序在运行时需要使用某个类时,类加载器会先查找该类是否已经被加载到内存中。若没有,则进行加载,即使用类加载器读取该类的字节码并生成对应的Class对象。然后进行链接,包括验证、准备和解析三个步骤,检查加载的类是否合法并进行内存分配等工作。最后进行初始化,即执行类构造器方法()。
Java虚拟机有3种类加载器,分别是引导类加载器(Bootstrap ClassLoader)、扩展类加载器(Extension ClassLoader)和系统类加载器(AppClassLoader)。其中,引导类加载器负责加载JVM自身以及核心库中的类;扩展类加载器和系统类加载器则负责加载用户自定义的类。
ClassLoader类中定义了两个重要的方法:loadClass和findClass。loadClass方法负责委派给父类加载器加载类,若父类加载器无法加载,则调用findClass方法加载。findClass方法实现类的自定义加载,即通过字节码获取Class对象。
自定义类加载器可以通过继承ClassLoader类,并实现findClass方法自定义加载类。这种方式常用于实现模块化系统或实现类热加载等场景。