Java 8多线程实用技巧大全:提升并发编程效率的终极指南

深入理解Java多线程:并发编程综合指南 本文还有配套的精品资源,点击获取 简介:本资料集旨在帮助Java开发者深入学习多线程编程,从基础概念到高级并发控制策略,涵盖了Java并发编程的全方位知识。内容包括多线程基础、内存模型、线程安全、锁的优化、无锁编程、并发工具类、设计模式、JDK8新特性、NIO和AIO,以及Jetty服务器的并发处理机制。通过这些系统的资料,读者将能够全面提升并发编程能力,更好地应对实际项目... 阅读详情

在当今多核处理器普及的时代,掌握Java多线程编程是开发高性能应用的关键。Java 8提供了丰富的并发工具,让开发者能够更高效地利用系统资源。本文将深入探讨Java 8多线程的实用技巧,帮助您构建高性能并发应用。

一、线程池最佳实践:避免资源耗尽

1. 使用Executors工厂方法创建线程池(谨慎使用)

// 固定大小线程池 - 适用于已知并发量
ExecutorService fixedPool = Executors.newFixedThreadPool(10);

// 缓存线程池 - 适合大量短生命周期的异步任务
ExecutorService cachedPool = Executors.newCachedThreadPool();

// 调度线程池 - 定时任务专用
ScheduledExecutorService scheduledPool = 
    Executors.newScheduledThreadPool(4);

注意:Executors.newFixedThreadPool()和Executors.newCachedThreadPool()在实际生产环境中需谨慎使用。推荐手动创建ThreadPoolExecutor:

ThreadPoolExecutor customPool = new ThreadPoolExecutor(
    4, // 核心线程数
    10, // 最大线程数
    60, // 空闲线程存活时间(秒)
    TimeUnit.SECONDS,
    new ArrayBlockingQueue<>(100), // 任务队列
    new ThreadPoolExecutor.CallerRunsPolicy() // 拒绝策略
);

2. 合理配置线程池参数

  • 核心线程数:CPU密集型任务推荐 N+1(N为CPU核心数)
  • 最大线程数:IO密集型任务推荐 2N+1
  • 任务队列:根据业务特点选择
    • SynchronousQueue:直接传递,无缓冲
    • ArrayBlockingQueue:有界队列
    • LinkedBlockingQueue:无界队列(慎用,可能导致OOM)
  • 拒绝策略:
    • AbortPolicy:默认策略,抛出异常
    • CallerRunsPolicy:调用者线程执行任务
    • DiscardOldestPolicy:丢弃队列最前面的任务
    • DiscardPolicy:直接丢弃新任务

二、CompletableFuture:异步编程新范式

1. 创建异步任务

// 无返回值的异步任务
CompletableFuture<Void> future = CompletableFuture.runAsync(() -> {
    System.out.println("异步任务执行中...");
}, executor);

// 有返回值的异步任务
CompletableFuture<String> futureWithResult = CompletableFuture.supplyAsync(() -> {
    return "任务结果";
}, executor);

2. 任务链式处理

CompletableFuture.supplyAsync(() -> fetchUserData())
    .thenApply(user -> processUserData(user)) // 同步转换
    .thenAccept(result -> saveResult(result)) // 消费结果
    .exceptionally(ex -> { // 异常处理
        System.err.println("任务失败: " + ex.getMessage());
        return null;
    });

3. 多任务组合

CompletableFuture<String> task1 = CompletableFuture.supplyAsync(() -> "结果1");
CompletableFuture<String> task2 = CompletableFuture.supplyAsync(() -> "结果2");

// 等待所有任务完成
CompletableFuture<Void> allOf = CompletableFuture.allOf(task1, task2);

// 任意一个任务完成
CompletableFuture<Object> anyOf = CompletableFuture.anyOf(task1, task2);

// 组合两个任务结果
CompletableFuture<String> combined = task1.thenCombine(task2, (res1, res2) -> res1 + res2);

三、并行流:简化集合并行处理

1. 基础用法

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);

// 顺序流
long sequentialTime = measureTime(() -> 
    numbers.stream().map(this::compute).collect(Collectors.toList()));

// 并行流
long parallelTime = measureTime(() -> 
    numbers.parallelStream().map(this::compute).collect(Collectors.toList()));

System.out.println("顺序处理时间: " + sequentialTime + "ms");
System.out.println("并行处理时间: " + parallelTime + "ms");

2. 注意事项与优化技巧

  • 避免共享可变状态:并行流操作应是无状态的
  • 使用线程安全的收集器:
    Map<Integer, List<String>> grouped = data.parallelStream()
        .collect(Collectors.groupingByConcurrent(Data::getCategory));
    
  • 调整并行度:
    System.setProperty("java.util.concurrent.ForkJoinPool.common.parallelism", "8");
    
  • 避免在IO操作中使用:并行流适合CPU密集型任务

四、原子类与并发容器:高效线程安全

1. 原子类使用技巧

// 传统方式
private int counter = 0;
public synchronized void increment() {
    counter++;
}

// Java 8原子类方式
private AtomicInteger atomicCounter = new AtomicInteger(0);
public void atomicIncrement() {
    atomicCounter.incrementAndGet();
}

// 高性能场景使用LongAdder
private LongAdder adder = new LongAdder();
public void add() {
    adder.add(1);
}
public long sum() {
    return adder.sum();
}

2. ConcurrentHashMap增强方法

ConcurrentMap<String, Integer> map = new ConcurrentHashMap<>();

// 不存在时添加
map.putIfAbsent("key", 1);

// 原子更新
map.compute("key", (k, v) -> v == null ? 1 : v + 1);

// 合并值
map.merge("key", 1, Integer::sum);

// 搜索(并行搜索)
Integer result = map.search(1, (k, v) -> v > 100 ? v : null);

// 遍历(并行遍历)
map.forEach(1, (k, v) -> System.out.println(k + "=" + v));

五、锁机制优化:提升并发性能

1. StampedLock:乐观读锁

public class Point {
    private double x, y;
    private final StampedLock lock = new StampedLock();
    
    // 写方法
    public void move(double deltaX, double deltaY) {
        long stamp = lock.writeLock();
        try {
            x += deltaX;
            y += deltaY;
        } finally {
            lock.unlockWrite(stamp);
        }
    }
    
    // 读方法
    public double distanceFromOrigin() {
        // 尝试乐观读
        long stamp = lock.tryOptimisticRead();
        double currentX = x, currentY = y;
        
        // 检查是否被修改
        if (!lock.validate(stamp)) {
            // 升级为悲观读锁
            stamp = lock.readLock();
            try {
                currentX = x;
                currentY = y;
            } finally {
                lock.unlockRead(stamp);
            }
        }
        return Math.sqrt(currentX * currentX + currentY * currentY);
    }
}

2. ReadWriteLock优化技巧

private ReadWriteLock lock = new ReentrantReadWriteLock();

public void readOperation() {
    lock.readLock().lock();
    try {
        // 读操作
    } finally {
        lock.readLock().unlock();
    }
}

public void writeOperation() {
    lock.writeLock().lock();
    try {
        // 写操作
    } finally {
        lock.writeLock().unlock();
    }
}

最佳实践:读写锁适合读多写少的场景,当写操作频繁时,考虑使用StampedLock或ConcurrentHashMap

六、线程安全设计模式

1. 不可变对象模式

// 使用final修饰类和字段
public final class ImmutablePoint {
    private final int x;
    private final int y;
    
    public ImmutablePoint(int x, int y) {
        this.x = x;
        this.y = y;
    }
    
    // 只有getter方法,没有setter
    public int getX() { return x; }
    public int getY() { return y; }
}

2. ThreadLocal应用场景

// 为每个线程维护独立的SimpleDateFormat实例
private static final ThreadLocal<SimpleDateFormat> dateFormatHolder = 
    ThreadLocal.withInitial(() -> new SimpleDateFormat("yyyy-MM-dd"));

public String formatDate(Date date) {
    return dateFormatHolder.get().format(date);
}

七、性能监控与故障排查

1. 线程转储分析

# 获取线程转储
jstack <pid> > thread_dump.txt

# 分析工具推荐:
# 1. VisualVM
# 2. FastThread (https://fastthread.io)

2. 检测死锁

// 编程方式检测死锁
ThreadMXBean threadMXBean = ManagementFactory.getThreadMXBean();
long[] deadlockedThreads = threadMXBean.findDeadlockedThreads();
if (deadlockedThreads != null) {
    System.err.println("检测到死锁!");
    ThreadInfo[] threadInfos = threadMXBean.getThreadInfo(deadlockedThreads);
    for (ThreadInfo threadInfo : threadInfos) {
        System.out.println(threadInfo);
    }
}

3. 监控线程池状态

ThreadPoolExecutor executor = ...;

// 定期打印线程池状态
ScheduledExecutorService monitor = Executors.newSingleThreadScheduledExecutor();
monitor.scheduleAtFixedRate(() -> {
    System.out.println("活跃线程数: " + executor.getActiveCount());
    System.out.println("任务队列大小: " + executor.getQueue().size());
    System.out.println("已完成任务数: " + executor.getCompletedTaskCount());
}, 1, 1, TimeUnit.SECONDS);

八、Java 8多线程最佳实践总结

  1. 线程池选择:

    • 短任务:缓存线程池
    • 长任务:固定大小线程池
    • 定时任务:调度线程池
  2. 资源管理:

    • 使用try-with-resources管理AutoCloseable资源
    try (ExecutorService executor = Executors.newVirtualThreadPerTaskExecutor()) {
        // 使用executor
    }
    
  3. 避免常见陷阱:

    • 不要捕获InterruptedException后不做处理
    • 避免过度同步
    • 谨慎使用Thread.stop()(已废弃)
  4. 性能优化:

    • 使用LongAdder代替AtomicLong用于高并发计数
    • 优先使用ConcurrentHashMap而不是同步的HashMap
    • 使用StampedLock优化读写锁场景
  5. 异步编程:

    • 使用CompletableFuture替代传统的Future
    • 合理使用并行流处理大数据集
    • 使用@Async注解(Spring框架)简化异步方法调用

“并发编程的艺术不在于做更多的事情,而在于更高效地协调资源。” - Brian Goetz(Java并发编程实战作者)

通过掌握这些Java 8多线程实用技巧,您将能够构建高性能、高并发的应用程序,充分利用现代多核处理器的计算能力。记住,良好的并发设计不仅提升性能,还能提高代码的可维护性和可靠性。

【论文精读】DisCo: Graph-Based Disentangled Contrastive Learning for Cold-Start Cross-Domain Recommendat 源域中具有相似偏好的用户在目标域中可能会表现出不同的兴趣。因此,直接迁移嵌入可能会引入不相关的源域协同信息。提出了一个基于图的解耦对比学习框架,以捕捉细粒度的用户意图并过滤掉不相关的协同信息,从而避免负迁移。 具体而言,对于每个域,我们使用多通道图编码器来捕捉多样化的用户意图。然后,我们在嵌入空间中构建亲和图,并执行多步随机游走以捕捉高阶用户相似性关系。将一个域视为目标域,我们提出了一种以用户相似性为指导的解耦意图对比学习方法,以优化跨域的用户意图桥接。 阅读详情

相关推荐

A robust and easy to implement method for IMU calibration without external equipments(IMU标定)

A robust and easy to implement method for IMU calibration without external equipments 1 标定原理1 亲试可用,还有动态演示效果不错。相比商用产品的简易标定流程,该标定方法有以下几点不同: 给出了加速度计和陀螺仪更复杂的模型。 利用Allan方差的定义,标定陀螺仪的偏置。 大量冗余数据,保证最优化收敛。利用数十...

擦擦擦大侠的博客 3950

掌握这5种多线程方法,提高Java代码效率

介绍5种多线程方法,助您提高编码效率!

u013643074的博客 971

Java 大视界 -- Java+Spark MLlib 构建智能推荐系统:协同过滤算法实战与优化(441)

Java+Spark MLlib构建智能推荐系统实战 本文详细介绍了基于Java和Spark MLlib构建协同过滤推荐系统的全流程实践方案。主要内容包括: 架构设计:采用离线批处理为主、近实时更新为辅的架构,包含数据采集层、处理层、模型层、推荐生成层、存储层和应用层六大模块,可支撑千万级用户推荐需求。 技术实现: 使用Spark MLlib的ALS算法进行协同过滤模型训练 提供数据清洗、模型训练、推荐生成等核心代码实现 采用MySQL存储推荐结果,支持批量插入和事务保障 生产级优化: 版本化模型存储规避覆

【青云交】华为云云享专家 | 阿里云开发者社区专家博主 技术圈个人影响力前 9 | 博客之星 TOP12 优快云 首位四榜(原力榜 / 作者周榜 / 领军人物 / 综合热榜)榜首,破平台纪录! 苏州地区全榜霸榜,感恩全网十多万粉丝同行! 2554

如何使用Java多线程编程?如何优化Java代码的执行效率?

如何使用Java多线程编程? 如何优化Java代码的执行效率? 1. 编写注释和文档 2. 遵循代码规范和约定 3. 异常处理和错误检查 4. 尽量避免硬编码 5. 减少对象的创建和销毁 6. 使用同步机制控制线程访问 7. 尽量使用基本数据类型 8. 合理设置变量作用域 9. 使用适当的算法和数据结构 10. 及时回收无用对象 通过对以上十个方面的注意,可以提高Java程序的可读性、可维护性、并发性和安全性,并优化程序的执行效率和资源利用效率。

ZP1008yy的博客 750

手把手教你用Ubuntu 22.04的附加驱动工具安装NVIDIA显卡驱动(含常见错误修复)

本文详细介绍了在Ubuntu 22.04系统上,如何通过图形化的“附加驱动”工具安全、便捷地安装NVIDIA显卡驱动。内容涵盖从准备工作、禁用默认的nouveau驱动、图形界面安装实操,到安装后的验证(如使用nvidia-smi命令),并提供了安装失败黑屏、亮度调节失效等常见问题的深度解决方案,帮助用户彻底搞定驱动安装难题。

weixin_29248653的博客 603

谈谈SAP顾问的几个发展趋势

大家新年好,今天想聊一下对SAP顾问发展趋势的一些个人见解。过去10多年得益于我国的经济发展,外资不断加大在中国的投资和中国企业的发展,SAP顾问行业得到了很大的发展和壮大。那么未来几年SAP顾问的职业发展到底怎么样呢?

syounger的专栏 2515

实践笔记分享:高并发项目Java8多线程几种场景实现

微信公众号:[Java技术干货]关注Java技术、关注前端后端全栈技术。问题或建议,请公众号留言。最近在弄一个高并发项目,经过接口压测后,各项指标不禁人意,也一直在搞程序调优(Nginx、Redis、数据库)。真的是被虐得是体无完肤,发丝也日渐脆弱。哎………….还在锤炼中………在调优的过程中,我把在程序中遇到多线程优化的几个场景案例记录分享一下,以供学习和交流。场景一:数据拆分多个subList,...

Java技术干货 1824

非sudo用户如何安全使用Docker:Rootless模式实战指南

Docker Rootless模式是一种基于Linux用户命名空间(userns)的容器运行时安全机制,它通过UID/GID映射、fuse-overlayfs文件系统和slirp4netns网络栈,在不提升权限的前提下实现容器隔离。其核心原理是将容器内root身份映射为宿主机非特权用户,从而规避docker组等价root的安全风险。相比传统root模式,Rootless在权限控制、逃逸防护和多租户隔离方面具备天然优势,适用于CI/CD流水线、Kubernetes边缘节点及受限生产环境。本文聚焦无sudo权限

weixin_30274627的博客 351

为什么使用多线程,多线程如何提高效率

一、 从多线程提高程序执行效率的角度,讨论如何提高效率以及为什么使用多线程 1.1 在多核处理系统上,将要执行的任务分割成多个可并行执行线程,就可以提高执行速率 1.2 单处理器上多线程只能并发执行而不是并行,并发原理,其实就是cpu快速来回切换,在特定的时间执行特定的某一个任务。并发执行存在着线程间上下文切换的问题,会消耗一定的时间。如果不考虑阻塞,多线程并发执行其实比单线程执行更加耗费时间...

Mr_moving 7921

大模型对齐的核心引擎:RLHF三阶段完整技术体系详解——从InstructGPT到ChatGPT与Claude 4.6的工程实践

RLHF从InstructGPT起步,经由ChatGPT、Claude系列的工程实践,已演变为现代大语言模型不可或缺的对齐基础设施。其三阶段流程——SFT构建基础能力基线,奖励模型将人类偏好编码为可微信号,PPO以KL约束驱动策略向偏好分布优化——构成了当代对齐技术的核心骨架。OpenAI的路线侧重于以海量人工标注和多目标奖励建模持续精细化RLHF流程,在规模与工程深度上持续推进;

nmdbbzcl的博客 1073

1、工作流介绍

工作流起源于办公自动化,是对软件中业务流程的抽象。通过工作流将各个任务有序组织起来形成一个完整的业务闭环。比如:请假审批流程,网上购物流程,银行贷款流程;!

leyoliu的博客 5114

使用Java的多线程提高程序性能

在这段代码中,我们创建了一个名为MyRunnable的实现了Runnable接口的类,并实现了run()方法。在main()方法中,我们创建了一个Thread对象,并将MyRunnable对象作为参数传递给Thread的构造函数,然后调用start()方法来启动线程。本文介绍了使用Thread类和Runnable接口创建线程的方法,并展示了如何使用synchronized关键字实现线程同步。在这段代码中,我们创建了一个名为MyThread的自定义线程类,重写了run()方法来定义线程的执行逻辑。

Y18870954401的博客 325

【测开求职】面试题:计算机网络 详细版整理

本篇文章是笔者为准备研究生复试和校招而写,因此主要针对问答,注重理解,而不在于细节计算。读者可以先查看上面的链接走一遍计算机网络的整体框架结构。其中,重点难点以及易混淆的知识点,笔者会用其他文章进行了详述,在知识点处贴好了链接,有需要的可以查阅。

vector的博客 5937

并发编程:Java高效多线程实战指南

并发编程是现代软件开发中的关键技术,尤其在Java中,它通过多线程机制实现任务的高效执行。并发与并行的主要区别在于任务执行方式:并发是任务交替执行,适用于单核CPU;并行是任务同时执行,依赖多核CPU。

m0_71744084的博客 2881

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

8w字 | Java并发编程 全套功法

优快云统计字数:77153字,Java多线程从入门到精通,由浅入深。:heart::heart:[建议收藏!]:heart::heart: 文章结合代码与理论,形象的解释了JMM模型、各种锁......

Javaer 3万+

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

java多线程编程_阿里P8推荐金九银十进大厂必备:两大java线程与并发编程实战文档...

前言2020年,对程序员来说是一个非常大的挑战,同时也是充满机遇的,要看你自己怎么来把握!因为年初的时候,疫情还比较严重,许多互联网企业都被拖垮了,很多程序员被裁掉了,金三银四也给泡汤了!!估计,有的程序员已经在家里面坐了很久了,天天投简历,屡屡被拒,尤其武汉的程序员更加煎熬,在不知不觉中现在已经八月份了!虽然这已经是铁板的事实,但是你知道这现实的背后有多么可怕么?小编发现的一个点,就是不善于发现...

weixin_39950552的博客 135

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

阿里P8推荐金九银十进大厂必备:两大java线程与并发编程实战文档

全文共8章,分别介绍了Thread类和Runnable接口、同步、等待和通知、线程组、定时器框架、并发工具、同步器、锁框架,以及高级并发工具等方面的主题。为了弥补大家技术的缺陷,特意把阿里P8大牛推荐金九银十进大厂必备的两大实战文档:java多线程编程实战指南、java线程与并发编程实践给大家分享出来了,它可以解决大家能够遇到的所有多线程与高并发问题,希望大家能够喜欢!第7章介绍了锁框架,它提供了大量针对锁及条件等待的接口和类,这种方式不同于对象原生的基于锁的同步以及Object的等待/通知机制。

程序员高级码农的博客 1071

从死锁到秒杀:Java 并发编程的 7个避坑指南,看完效率提升 300%!

在 Java 开发中,并发编程既是提升系统性能的关键,也是 Bug 的重灾区。本文将拆解并发编程中的核心痛点,结合实战场景给出可落地的解决方案,帮你避开 90% 的常见陷阱。synchronized 在 JDK1.6 后的优化(偏向锁、轻量级锁、重量级锁)使其性能大幅提升,但在高并发场景下仍有优化空间。当线程池中的线程长期存活时,ThreadLocal 中的值不会被回收,逐渐耗尽内存。某金融系统通过 AOP 拦截所有加锁操作,记录锁获取顺序,在测试环境提前发现潜在死锁,避免了生产事故。

weixin_44075173的博客 839

Java并发编程

并发编程与java

vip_member888的博客 1816

技术分享java并发编程

Java并发编程 1.什么是java并发编程 ​ Java是一种多线程编程语言,我们可以使用Java来开发多线程程序。 多线程程序包含两个或多个可同时运行的部分,每个部分可以同时处理不同的任务,从而能更好地利用可用资源,特别是当您的计算机有多个CPU时。多线程使您能够写入多个活动,可以在同一程序中同时进行操作处理。 根据定义,多任务是当多个进程共享,如CPU处理公共资源。 多线程将多任务的概念扩展到可以将单个应用程序中的特定操作细分为单个线程的应用程序。每个线程可以并行运行。 操作系统不仅在

superzc的博客 2422

【好书分享第十三期】618精选编程书单:提升你的代码力

●《深入理解Java虚拟机》(第3版):周志明老师编著,深入剖析Java虚拟机的工作原理,让你对Java性能优化有更深的理解。●《Java核心技术 卷I:开发基础》(原书第12版):深入浅出地介绍了Java编程的基础知识,适合初学者和有经验的开发者。●《Java核心技术 卷II:高级特性》(原书第12版):深入探讨Java的高级特性,让你的Java技能更上一层楼。●《Java并发编程的艺术》第2版:深入探讨Java并发编程的复杂性,帮助你掌握多线程编程的精髓。618大促来袭,是时候为你的书架添置新成员了!

屿小夏.的知识博客 3万+

Java并发编程详细记录,多线程,常用方法,JUC框架,线程池,锁

多线程概念,创建线程,常用方法,Synchronized锁升级,wait,ThreadLocal。 JUC并发编程,线程池,原子类,CAS,AQS,ABA,ReentrantLock。

n_AloneT的博客 1207

多线程--JUC并发编程

多线程、并发相关知识点

weixin_45690338的博客 2096

深入理解 Java 中的 CompletableFuture:提升并发编程的效率

CompletableFuture 是 Java 8 引入的异步编程工具,相比 Future 提供了更强大的功能。它支持异步任务链、回调处理、任务组合和异常处理,能显著简化并发编程。通过 supplyAsync 启动异步任务,thenApply 等链式方法处理结果,exceptionally 捕获异常,allOf/anyOf 组合多个任务,使代码更简洁高效。本文介绍了 CompletableFuture 的基本用法和高级特性,帮助开发者提升 Java 应用的并发性能。

weixin_47905944的博客 492

阿里P8推荐金三银四进大厂必备:两大java线程与并发编程实战

这两份实战文档:java多线程编程实战指南、java线程与并发编程实践,是大牛经过层层筛选,万里挑一,才得以分享给大家来学习的,希望大家能够珍惜,把这些技术知识都掌握在自己手中,来强大自身,拿到自己梦寐以求的薪资和职位!乘风破浪会有时,直挂云帆济沧海!!理想很丰满,现实很骨感,加油吧!少年!

m0_57042151的博客 122

JAVA1.8 vs 旧版本:开发效率对比实验

对于需要展示效果的Java Web项目,平台的一键部署功能特别实用。这种即时可见的反馈对理解版本差异很有帮助,推荐Java开发者都尝试下这种直观的学习方式。这类在线开发环境里,配合实时预览功能可以快速验证新特性的效果,无需本地搭建复杂的Java环境。和Java 7分别实现了几个常见功能,通过实际对比发现新版本在开发效率上的优势确实非常明显。下面分享我的实验过程和结果分析。在Java开发领域,版本迭代带来的效率提升一直是开发者关注的焦点。- 可读性评分(1-5分):Java 7得3分,Java 8得5分。

ThunderstormLynx23的博客 969
上一篇: Java 8 到 Java 24 新特性全景解析:十年演进与技术革命
下一篇: 千万级大表性能调优终极指南:从SQL优化到架构升级
Java_ESS
博客等级 码龄7年 97粉丝 25原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值