Java中的原子类-枚举-类加载器

2024-01-10 13:17:58

原子类-枚举-类加载器

原子类介绍:

原子类是指能够保持自身状态的类,具有原子性质,不会被其他线程中断或干扰。在并发编程中,使用原子类能够实现线程安全,避免竞态条件和死锁等问题。

Java中的原子类包括AtomicBooleanAtomicIntegerAtomicLongAtomicReferenceAtomicStampedReference等,它们都提供了原子操作方法,如compareAndSet、incrementAndGet、decrementAndGet等,可以确保操作的原子性和线程安全性。

虽然原子类提供了原子性和线程安全性,但并不保证多个原子操作的组合操作也是原子的。在并发环境下,也需要使用锁和同步机制来保证多个操作的整体原子性。

原子类的方法总结:

Java中的原子类提供的这些方法都是线程安全的,不会被其他线程中断或干扰。

  1. 读取方法
  • get():获取当前值
  1. 修改方法
  • set():设置当前值
  • lazySet():延迟设置当前值。与set()不同的是,它不保证其他线程立即看到修改后的值,而是在可能的情况下延迟更新值,从而提高性能。
  • compareAndSet():比较并设置。如果当前值等于预期值(expected),则设置新值(update)并返回true;否则返回false。
  • weakCompareAndSet():弱比较并设置。与compareAndSet()类似,但是在一些平台上不保证原子性,因此在可能的情况下也会延迟更新值,从而提高性能。
  1. 自增自减方法
  • incrementAndGet():自增1并返回新值
  • getAndIncrement():返回当前值并自增1
  • decrementAndGet():自减1并返回新值
  • getAndDecrement():返回当前值并自减1
  1. 加减方法
  • addAndGet(int delta):增加指定值delta并返回新值
  • getAndAdd(int delta):返回当前值并加上指定值delta
  1. 其他方法
  • getAndSet():获取当前值并设置新值。
  • weakCompareAndSetVolatile()compareAndExchange()等,基本与compareAndSet()类似。

虽然原子类提供了原子性和线程安全性,但不保证多个原子操作的组合操作也是原子的。在并发环境下,也需要使用锁和同步机制来保证多个操作的整体原子性。

Java中枚举的特点:

Java中枚举是一种特殊的数据类型,它允许我们将一组具有相同属性的常量组合在一起并进行管理。枚举的特点有:

  1. 在枚举中只能定义常量,不能定义变量。
  2. 枚举的常量可以具有不同类型的值,但它们必须在枚举声明中被初始化。
  3. 枚举可以具有方法,可以覆盖从枚举类继承的方法。

枚举的常用方法如下:

  1. values(): 返回枚举类型的常量数组。
  2. valueOf(String name): 返回名称为name的枚举常量。
  3. name(): 返回枚举常量的名称。
  4. 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方法自定义加载类。这种方式常用于实现模块化系统或实现类热加载等场景。

文章来源:https://blog.csdn.net/2301_77898017/article/details/135499206
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。