月度记录-2024-9月

132 阅读6分钟

1. java synchronized可以用字符串当作锁吗?

在 Java 中,synchronized 关键字可以用来锁定任何对象,包括字符串:

public class Example {
    private String lock = "lockString";
    public void synchronizedMethod() {
        synchronized (lock) {
            // 需要同步的代码块
            System.out.println("Thread-safe block");
        }
    }
}

在上述代码中,lock 是一个字符串对象,synchronized 使用它来确保同步块中的代码在同一时间只有一个线程能够执行。

为什么不推荐使用字符串作为锁?

虽然可以使用字符串作为锁对象,但这样做可能会导致一些潜在的问题:

字符串常量池问题:在 Java 中,字符串是驻留在常量池中的。如果两个不同的类或模块使用相同的字符串字面值作为锁,它们实际上可能在使用同一个锁对象。例如

String lock1 = "sameString";
String lock2 = "sameString";

if (lock1 == lock2) {
    System.out.println("Same lock object");
}

由于 Java 对字符串字面值的优化,lock1 和 lock2 引用的是同一个字符串对象。这意味着如果两个不同的类都使用 "sameString" 作为锁,它们可能会无意中共享同一个锁,导致意外的竞争条件或死锁。

  • 字符串的不可变性:字符串是不可变的(immutable),一旦创建就不能被改变。这种不可变性虽然保证了线程安全,但也意味着一旦字符串作为锁使用,它不能被动态改变或释放。
  • 难以调试:使用字符串作为锁对象可能会使代码难以调试和维护,尤其是在项目中使用相同的字符串作为锁时,容易引发难以察觉的问题。

2. yum

yum(Yellowdog Updater Modified)是一个在基于 RPM(Red Hat Package Manager)包管理的 Linux 发行版上使用的包管理工具,广泛应用于 CentOS、RHEL(Red Hat Enterprise Linux)等操作系统。

yum 的主要作用是简化软件包的管理,它能够自动解决软件包之间的依赖关系,并提供安装、更新、删除和查询软件包的功能。使用 yum,用户不需要手动下载和安装 RPM 文件,它可以自动从配置的远程软件源下载和安装所需的软件包。

yum 的优势:

  • 自动解决依赖性问题:yum 可以自动检测和解决软件包之间的依赖关系,而无需手动处理。
  • 简单易用:提供简单的命令来管理软件包,减少繁琐的手动操作。
  • 支持远程仓库:从远程服务器上自动下载和安装软件包。
  • 插件支持:可以通过插件扩展 yum 的功能,例如缓存、速度优化等。

在 CentOS 8 和 RHEL 8 之后,yum 已经被 dnf(Dandified YUM)所取代,dnf 是 yum 的下一代替代品,具有更好的性能和依赖解决能力。

3. .swp文件是什么?

.swp 文件是 Vim 编辑器在编辑文件时生成的一个 交换文件(swap file)。它的主要功能是用于在编辑过程中保存临时数据,以便在意外崩溃或中断时能够恢复文件的编辑状态。

.swp 文件的作用:

  1. 数据恢复:如果你在编辑过程中,Vim 编辑器意外退出(比如系统崩溃、电源故障),.swp 文件保存了文件的临时状态。下一次你打开该文件时,Vim 会提示是否从 .swp 文件中恢复数据。
  2. 防止多个 Vim 实例同时编辑同一个文件:当你用 Vim 编辑一个文件时,.swp 文件会被创建。如果你尝试再次打开同一个文件,Vim 会通过检测 .swp 文件来提醒你,避免多个实例同时编辑导致数据冲突。

.swp 文件的特点:

  • 自动生成:当你用 Vim 编辑文件时,它会自动生成一个 .swp 文件,文件名类似于 ..swp,存放在同一个目录下。
  • 自动删除:当你正常退出 Vim 并保存文件时,.swp 文件会自动被删除。
  • 手动删除:如果 Vim 崩溃或未正常退出,.swp 文件可能会残留。下次打开文件时会看到提示,提醒你 .swp 文件的存在。在这种情况下,你可以手动删除该文件。

如何处理 .swp 文件:

  • 如果你在编辑文件时遇到 .swp 文件冲突提示,表明 Vim 检测到了该文件的 .swp 文件。这时你可以:

  • 恢复未保存的更改,使用 :recover。

  • 如果确认文件没有问题且不需要恢复,可以手动删除 .swp 文件。

例如,删除 .swp 文件的命令:

rm /path/to/file/.filename.swp

总结:

  • .swp 文件是 Vim 编辑过程中用于保存临时数据的交换文件,旨在帮助你在编辑器崩溃时恢复未保存的更改。
  • .swp 文件通常自动删除,只有在 Vim 异常退出时才会残留。
  • 如果你不需要恢复数据,可以安全地删除这些 .swp 文件。

4. 为何我可以访问谷歌但是却ping不通呢?

。。。

5. java 什么时候用var比较好?

我会有这个疑问主要是觉得使用var会降低代码的可读性,可是6解决了这个问题,所以,想用就用!

6. IDEA使用var关键字时能够显示推断数据类型

设置方法:File->Setting->Editor->Inlay Hints->Types->勾选Java->Apply

这么设置之后var后面就会出现:XXX,能看到真实的类型了。

7. Java中Optional.of(),ifPresent

Optional.of() 是 Java 8 中引入的一个方法,用于创建一个包含非空值的 Optional 对象。如果传入的值为 null,它会抛出 NullPointerException。这个方法的目的是避免直接使用 null,从而减少空指针异常的风险。

ifPresent 是 Optional 类中的一个方法,用于判断 Optional 中是否存在值。如果存在,则执行传入的 Lambda 表达式;如果不存在,则什么都不做。这种方式让代码更加简洁和优雅。例如:

Optional<String> optional = Optional.of("Hello");
optional.ifPresent(value -> System.out.println(value));

如果 optional 为空,则不会输出任何内容。这样可以避免显式的空值检查。

Optional.ofNullable() 是 Java 8 中的一个方法,用于创建一个可能为空的 Optional 对象。与 Optional.of() 不同,ofNullable() 可以接受 null 值。如果传入的值为 null,则返回一个空的 Optional;如果非空,则返回一个包含该值的 Optional。

使用示例:

String value = null;
Optional<String> optional = Optional.ofNullable(value);
optional.ifPresent(v -> System.out.println(v)); // 不会输出任何内容

这样,你可以方便地处理可能为 null 的情况,避免空指针异常。

8. @RequiredArgsConstructor 构造函数注入

@RequiredArgsConstructor 是 Lombok 提供的一个注解,用于自动生成一个包含所有 final 字段和被标记为 @NonNull 字段的构造函数。这样,你可以简化类的构造函数代码,增强可读性,同时确保这些字段在对象创建时被正确初始化。

在 Spring 中可以使用 @RequiredArgsConstructor 实现构造器注入。通过这个注解,Lombok 会自动生成一个构造函数,注入所有的 final 字段,适合用于依赖注入,简化代码书写。这样可以保持代码的整洁和可读性。

其实和@Resource这种注入也差不多,只是要用final修饰对象,以及类上加这个注解。