Java相关--记录

1、hashMap和 concuurentHashMap的区别

HashMap 和 ConcurrentHashMap 是 Java 中用于存储键值对的两种集合,它们之间有几个主要区别:

1. 线程安全性
HashMap: 不是线程安全的。如果多个线程同时访问一个 HashMap,并且至少一个线程修改了映射,它可能会导致不一致的数据。
ConcurrentHashMap: 是线程安全的,允许多个线程同时访问和修改,内部采用分段锁(Segment Locking)机制,减少了竞争,提供更高的并发性能。
2. 性能
HashMap: 在单线程环境下性能较好,因为不需要额外的同步开销。
ConcurrentHashMap: 在多线程环境下性能更优,因为它通过分段锁机制来减少锁竞争,允许并行读写操作。
3. 允许的空值
HashMap: 允许一个空键和多个空值。
ConcurrentHashMap: 不允许空键和空值。
4. 迭代器
HashMap: 迭代器是 fail-fast 的,如果在迭代过程中修改了集合,会抛出 ConcurrentModificationException。
ConcurrentHashMap: 迭代器是弱一致性的(weakly consistent),可以在迭代过程中安全地进行读操作,而不会抛出异常,但迭代结果可能不反映在迭代开始时的状态。
5. 适用场景
HashMap: 适用于单线程环境或不需要并发访问的场合。
ConcurrentHashMap: 适用于需要高并发访问的多线程环境。

总结
选择 HashMap 还是 ConcurrentHashMap 主要取决于应用场景。如果你的应用需要在多线程环境中安全地共享数据,选择 ConcurrentHashMap;如果在单线程环境中,HashMap 性能更佳。

2、分段锁(Segment Locking)机制 是什么

分段锁(Segment Locking)是一种用于提高并发性能的锁机制,特别是在多线程环境中。它将数据结构分为多个“段”,每个段都有自己的锁。这样,多个线程可以同时访问不同段的数据,从而减少锁竞争,提高性能。

主要特点:
分段结构:
数据被划分为多个独立的段,每个段包含一部分数据。这些段可以独立锁定。
锁粒度

每个段有自己的锁,允许多个线程同时访问不同段的数据。相较于全局锁,分段锁的粒度更细,减少了阻塞。
提高并发性:

由于多个线程可以并行操作不同的段,因此能够显著提高程序的并发性能。
示例:
ConcurrentHashMap 就是使用分段锁的一个实例。在 ConcurrentHashMap 中,整个映射被划分为多个段,每个段有自己的锁,线程在操作时只会锁住对应的段,而不是整个映射。
总结
分段锁机制通过减少锁的范围和数量,使得在高并发情况下的数据访问更高效,适用于需要频繁读写的多线程环境。

3、懒加载

懒加载(Lazy Loading)是一种设计模式,指的是在需要时才加载数据或对象,而不是在程序启动时一次性加载。这样可以提高性能,减少资源消耗,特别是在处理大量数据时。
主要优点:
节省资源:只有在实际需要时才加载数据,避免不必要的内存使用。
提高响应速度:初始加载更快,因为不需要加载所有内容。
按需处理:可以处理动态内容,避免一次性处理过多数据。
懒加载常用于Web开发、数据库查询和应用程序初始化等场景。

4、supplier<>

在Java中,Supplier 是一个函数式接口,位于 java.util.function 包中。它表示一个提供结果的供应者,不接受任何参数,返回一个结果。常用于懒加载和生成对象。

import java.util.function.Supplier;

public class SupplierExample {
    public static void main(String[] args) {
        Supplier<String> stringSupplier = () -> "Hello, Supplier!";
        
        // 调用 get 方法
        String result = stringSupplier.get();
        System.out.println(result);  // 输出: Hello, Supplier!
    }
}

在这个示例中,stringSupplier 是一个 Supplier,它在调用 get() 方法时返回一个字符串。你可以用它来生成对象或延迟计算。

5、日志级别

日志打印级别通常用于控制日志信息的详细程度,不同的级别适用于不同的场景。以下是常见的日志打印级别(以 Java 中的 SLF4J 或 Log4j 为例):

TRACE:最详细的日志级别,通常用于追踪程序执行流程,适合调试时使用。
DEBUG:调试信息,提供开发时需要的详细信息,但在生产环境中通常会关闭。
INFO:普通信息,表示应用程序的正常运行状态,例如启动、停止等。
WARN:警告信息,表示可能存在问题,但不影响程序的运行。
ERROR:错误信息,表示发生了异常,需要注意,但程序仍能继续运行。
FATAL:致命错误,表示严重问题,通常会导致程序终止。
设置:

  1. 如果日志级别设置为 INFO,那么只有 INFO 级别及以上的日志(如 WARN、ERROR、FATAL)会被打印。DEBUG 和 TRACE 级别的日志将不会被打印。
  2. 如果你希望同时打印 INFO 和 DEBUG 级别的日志,需要将日志级别设置为 DEBUG。这样就会打印所有 DEBUG级别及以上的日志。
  3. 总结: 设置为 INFO:打印 INFO、WARN、ERROR、FATAL 日志,不打印 DEBUG 和 TRACE。 设置为 DEBUG:打印 DEBUG、INFO、WARN、ERROR、FATAL 所有日志。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值