2023年Java核心技术面试第九篇(篇篇万字精讲)

 

目录

十七 . 并发相关基础概念

17.1 线程安全

17.2 保证线程安全的两个方法

17.2.1 封装

17.2.2 不可变

17.2.2.1 final 和 immutable解释

 17.3 线程安全的基本特性

17.3.1 原子性(Atomicity)

17.3.2 可见性(Visibility)

17.3.3 有序性

17.3.4 互斥性 


十七 . 并发相关基础概念

 可能前面几讲,一些同学理解可以有一些困难,这一篇将进行一些并发相关概念比较模糊,我们将进行并发相关概念的补充,

17.1 线程安全

线程安全就是在多线程的环境下正确的一个概念,保证在多线程的环境下是实现共享的,可修改的状态是正确性,状态可以类比为程序里面的数据。

如果状态不是共享的,或者不是可修改的,就不存在线程安全的问题。

17.2 保证线程安全的两个方法

17.2.1 封装

进行封装,我们将对象内部的状态隐藏,保护起来。

17.2.2 不可变

可以进行final和immutable进行设置。

17.2.2.1 final 和 immutable解释

finalimmutable 是 Java 中用来描述对象特性的关键字。

  1. final:用于修饰变量、方法和类。它的作用如下:

    • 变量:final 修饰的变量表示该变量是一个常量,不可再被修改。一旦赋值后,其值不能被改变。通常用大写字母表示常量,并在声明时进行初始化。
    • 方法:final 修饰的方法表示该方法不能被子类重写(覆盖)。
    • 类:final 修饰的类表示该类不能被继承。
  2. immutable:指的是对象一旦创建后,其状态(数据)不能被修改。不可变对象在创建后不可更改,任何操作都不会改变原始对象的值,而是返回一个新的对象。

不可变对象的主要特点包括:

  • 对象创建后,其状态无法更改。
  • 所有字段都是 final 和私有的,不可直接访问和修改。
  • 不提供可以修改对象状态的公共方法。

不可变对象的优点包括:

  • 线程安全:由于对象状态不可更改,因此多线程环境下不需要额外的同步措施。
  • 缓存友好:不可变对象的哈希值不会改变,因此可以在哈希表等数据结构中获得更好的性能。

 17.3 线程安全的基本特性

17.3.1 原子性(Atomicity)

指的是一系列操作要么全部执行成功,要么全部失败回滚。即一个操作在执行过程中不会被其他线程打断,保证了操作的完整性。

17.3.2 可见性(Visibility)

指的是当一个线程修改了共享变量的值后,其他线程能够立即看到最新的值。需要通过使用 volatile 关键字、synchronized 关键字、Lock 接口等机制来确保可见性。

17.3.3 有序性

指的是程序执行的顺序与预期的顺序一致,不会受到指令重排序等因素的影响。可以通过 volatile 关键字、synchronized 关键字、Lock 接口、happens-before 原则等来保证有序性。

17.3.4 互斥性 

指的是同一时间只允许一个线程对共享资源进行操作,其他线程必须等待。可以通过使用 synchronized 关键字、Lock 接口来实现互斥性。

你可能感兴趣的:(面试,职场和发展)