Java微服务架构师_Java 并发编程_002

2026微服务实战生存指南:从单体拆分到稳定上线 微服务不是架构幻梦,而是开发者在资源受限、需求高压、系统耦合的现实环境中必须掌握的工程能力。其核心原理在于通过边界识别、渐进拆分与可观测性前置,实现系统演进的可逆性与可控性;技术价值体现在降低故障扩散、加速需求交付、提升团队自治能力;典型应用场景包括高痛苦指数模块(如库存、订单)的优先解耦、数据库三态迁移、轻量级网关灰度发布等。本文聚焦2026年中小团队真实落地场景,深度融合Monolith解耦实践与Developer Survival一线经验,提供可立即执行的代码级、配置级、运维级操作路径。 阅读详情

从我们熟悉的同步锁了解多线程使用方式

synchronized几种使用方式

演示 (共享变量)同步锁的使用场景: 同步方法、 静态同步方法 、同步代码块

package com.allen.base.day02;

import java.util.Random;

public class SynchronizedDemo {
    public static void main(String[] args) {
        SynchronizedDemo demo = new SynchronizedDemo();

        Thread threadA = new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    demo.OneClass();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });
        Thread threadB = new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    demo.OneClass();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });


        threadB.start();
        threadA.start();
    }

    public synchronized void first() throws InterruptedException {
        double random = Math.random();
        System.out.println(random + " first======start=======>");
        Thread.sleep(5000);
        System.out.println(random + " first======end=======>");
    }

    public synchronized void second() throws InterruptedException {
        System.out.println("second=====start========>");
        Thread.sleep(5000);
        System.out.println("second======end=======>");
    }

    public void one() throws InterruptedException {
        double random = Math.random();
        System.out.println("进入线程===========。。。。" + random);
        synchronized (this) {
            System.out.println(random + " one=======start======>  ");
            Thread.sleep(5000);
            System.out.println(random + " one=======end======>  ");
        }
    }

    public synchronized void two() throws InterruptedException {
        synchronized (this) {
            System.out.println("two======start=======>");
            Thread.sleep(5000);
            System.out.println("two======end=======>");
        }
    }

    public void OneClass() throws InterruptedException {
        double random = Math.random();
        System.out.println(random);
        synchronized (SynchronizedDemo.class) {
            System.out.println(random + " OneClass======start=======>");
            Thread.sleep(5000);
            System.out.println(random + " OneClass======end=======>");
        }
    }
}

几种测试场景:

1、非静态同步方法

    public static void main(String[] args) {
        SynchronizedDemo demo = new SynchronizedDemo();

        Thread threadA = new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    demo.twoClass1();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });
        Thread threadB = new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    demo.twoClass1();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });


        threadB.start();
        threadA.start();
    }
    
    public synchronized void twoClass1() throws InterruptedException {
        System.out.println("twoClass1======start=======>");
        Thread.sleep(5000);
        System.out.println("twoClass1======end=======>");
    }

2、静态同步方法

 public static void main(String[] args) {
        SynchronizedDemo demo = new SynchronizedDemo();

        Thread threadA = new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    demo.twoClass2();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });
        Thread threadB = new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    demo.twoClass2();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });


        threadB.start();
        threadA.start();
    }
    
    public synchronized static void twoClass2() throws InterruptedException {
        System.out.println("twoClass2======start=======>");
        Thread.sleep(5000);
        System.out.println("twoClass2======end=======>");
    }

3、同步代码块

 public static void main(String[] args) {
        SynchronizedDemo demo = new SynchronizedDemo();

        Thread threadA = new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    demo.one();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });
        Thread threadB = new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    demo.one();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });


        threadB.start();
        threadA.start();
    }

    public void one() throws InterruptedException {
        double random = Math.random();
        System.out.println("进入线程===========。。。。" + random);
        synchronized (this) {
            System.out.println(random + " one=======start======>  ");
            Thread.sleep(5000);
            System.out.println(random + " one=======end======>  ");
        }
    }

组合场景:
1、静态同步方法与非静态同步方法

    public static void main(String[] args) {
        SynchronizedDemo demo = new SynchronizedDemo();

        Thread threadA = new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    demo.twoClass1();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });
        Thread threadB = new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    demo.twoClass2();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });


        threadB.start();
        threadA.start();
    }
    
    public synchronized void twoClass1() throws InterruptedException {
        System.out.println("twoClass1======start=======>");
        Thread.sleep(5000);
        System.out.println("twoClass1======end=======>");
    }

    public synchronized static void twoClass2() throws InterruptedException {
        System.out.println("twoClass2======start=======>");
        Thread.sleep(5000);
        System.out.println("twoClass2======end=======>");
    }

2、非静态同步方法与同步代码块

public static void main(String[] args) {
        SynchronizedDemo demo = new SynchronizedDemo();

        Thread threadA = new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    demo.twoClass1();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });
        Thread threadB = new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    demo.one();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });


        threadB.start();
        threadA.start();
    }
    
    public void one() throws InterruptedException {
        double random = Math.random();
        System.out.println("进入线程===========。。。。" + random);
        synchronized (this) {
            System.out.println(random + " one=======start======>  ");
            Thread.sleep(5000);
            System.out.println(random + " one=======end======>  ");
        }
    }
    public synchronized void twoClass1() throws InterruptedException {
        System.out.println("twoClass1======start=======>");
        Thread.sleep(5000);
        System.out.println("twoClass1======end=======>");
    }

3、静态同步方法与同步代码块

    public static void main(String[] args) {
        SynchronizedDemo demo = new SynchronizedDemo();

        Thread threadA = new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    demo.one();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });
        Thread threadB = new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    demo.twoClass2();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });


        threadB.start();
        threadA.start();
    }
    
    public void one() throws InterruptedException {
        double random = Math.random();
        System.out.println("进入线程===========。。。。" + random);
        synchronized (this) {
            System.out.println(random + " one=======start======>  ");
            Thread.sleep(5000);
            System.out.println(random + " one=======end======>  ");
        }
    }
    
    public synchronized static void twoClass2() throws InterruptedException {
        System.out.println("twoClass2======start=======>");
        Thread.sleep(5000);
        System.out.println("twoClass2======end=======>");
    }

总结

Java中的每一个对象都可以作为锁,
具体表现为以下3种形式
对于普通同步方法,锁是当前实例对象
对于静态同步方法,锁是当前类的Class对象
对于同步代码块,锁是synchronized括号中配置的对象

如果一个实例对象的非静态同步方法获取锁后,该实例对象的其他非静态同步方法必须等待获取方法释放锁后才能获取锁

所有的静态同步方法用的也是同一把锁:类对象本身
非静态同步方法与静态同步方法对应的锁是两个不同对象,所以静态同步方法非静态同步方法之间是不会有竞态条件的。
但是一旦一个静态同步方法获取锁后,其他的静态同步方法都必须等待该方法释放锁后才能获取锁,
不管是同一个实例对象的静态同步方法之间,还是不同实例对象的静态同步方法之间,只要他们是同一个类的实例对象 。

synchronized修饰方法使用的锁是当前对象this锁,
synchronized修饰静态方法使用的锁是当前类的字节码文件。
从JVM规范中可以看到synchronized在JVM中的实现原理,JVM基于进入与退出Monitor对象来实现方法的同步与代码块的同步,但两者实现细节不同,代码块同步是使用monitorenter和monitorexit指令实现的,而方法的同步是使用另一种方式实现的,细节在JVM规范中没有详细说明,但是,方法的同步同样可以使用这2个指令实现。
monitorenter指令是在编译后插入到同步代码块的开始位置,而monitorexit是插入到方法结束处和异常处,JVM要保证每一个monitorenter必须对应一个monitorexit对应,任何对象都有一个monitor与之关联,当且一个monitor被持有后,它将处于锁定状态,线程执行到monitorenter指令时,将会尝试获取对象所对应的monitor的所有权,即获取对象的锁。synchronized用的锁是在java对象的头里(Class字节码格式中的头部信息)

Java判断地图坐标(经度,纬度)是否在多边形区域或圆形区域内 ​欢迎光临我的博客查看最新文章:在地图上,可以使用经纬度确定一个位置,如上海体育场(121.449391,31.188228),如果知道了2个地点的经纬度,我们就能在地图上找到其位置及2点的距离,百度地图或高德地图提供了相应的服务;如果将多个坐标点连成多边形区域,如何判断某个坐标点是否在多边形区域内,如下工具类。 阅读详情

相关推荐

避坑指南:STM32CubeMX配置SDIO4bit模式时为什么卡在HAL_SD_ConfigWideBusOperation?

本文深入分析了使用STM32CubeMX配置SDIO 4位模式时,程序在HAL_SD_ConfigWideBusOperation函数处卡死的常见问题。文章从硬件连接、CubeMX配置、初始化序列及HAL库底层实现等多个维度剖析根源,并提供了从初始化流程优化到增强代码鲁棒性等实战解决方案,帮助开发者彻底解决这一棘手难题。

pca5navigator的博客 825

微服务火爆,Java可以干点什么?九大好处告诉你

  以下是我总结的学习微服务的九大理由: 现在,让我帮助您更详细地了解这些内容。 1.易于构建和维护应用程序 当开发人员构建的产品变得稳定并且在市场上供客户使用时,开发人员团队主要分为以下工作。 实现新功能 修复错误 更改现有功能 在这种情况下,如果产品基于单一框架,则代码库的每个更改都必须通过构建,维护和部署的所有阶段。 在这种情况下,微服务就像一个救...

程序员随笔 521

ESD放电模式以及电源箝位 (power clamp )电路

由于ESD电压具有很快的上升速度(其ESD脉冲上升时间约在10ns左右),Vrc端的电压因为RC延迟效应无法跟得上VDD端的ESD电压上升速度,Vrc端的为低电位导致反相器工由于ESD电压具有很快的上升速度(其ESD脉冲上升时间约在10ns左右),Vrc端的电压因为RC延迟效应无法跟得上VDD端的ESD电压上升速度,Vrc端的为低电位导致反相器工作将输出端Vout电压上拉到高电位。从而Vg端的高电位触发导通了NMOS元件(Mesd)的晶体管,因而ESD电流便经由Mesd而泄放掉。由于晶体管Mesd的栅极导通

DOG_BITE_DOG的博客 2万+

2021史上最全的Java架构师资料!你确定不要吗?

有很多朋友问我怎么才能学会编程,好多人都是在网上找资源,但是网上的资料也有好坏和新旧。找的资源太旧学的东西太老,跟不上企业需求,还没出去工作就被社会抛弃!着实打击学习积极性和自信心,为此架构君为大家精心整理了一些精品资源帮助大家学习编程,一起进步! 精品资源 我整理了手上一些视频资源,这些资源很多都是最新的视频,但是由于资源数据流巨大,超过 500G ,涉及到 Java 基础、Web 基础、数据库、Java 高级、Java 分布式、微服务,资源非常丰富,还在不断更新中! PS:,本文会定期更新,有新资源的时

Newerwu的专栏 837

Android开发中StateFlow与LiveData的5个关键区别及实战避坑指南

本文深度解析了Android开发中StateFlow与LiveData的5个核心区别,包括设计哲学、生命周期管理、值更新策略、线程模型及协程生态整合。通过实战代码对比,为开发者在现代MVVM架构下的状态管理选型提供清晰的决策指南和避坑建议,帮助构建更健壮、可测试的应用。

weixin_29012677的博客 402

常见的数值积分方法 (欧拉、中值、龙格-库塔,【常用于IMU中】)

1. 积分基本概念 设F(x)为函数f(x)的一个原函数,我们把函数f(x)的所有原函数F(x)+C(C为任意常数)叫做函数f(x)的不定积分(indefiniteintegral)。 非线性微分方程: 在有限的时间间隔Δt积分: 连续时间内积分: 工程上最常见的有三种:欧拉积分(Euler method)、中值积分(Midpoint method)和龙格-库塔法积分(Runge–Kutta methods)。他们的区别就是如何用数值方法模拟一个斜率。这里简单总结如下: ...

努力努力努力 2万+

干货合集 | 500 篇Java技术文章整理

今天,给大家推荐一位 Java 架构领域做得非常好的朋友:师长。师长的公众号:Java进阶架构师这3年来累积了200篇优质原创文章,及各类优质技术文章共500篇。其号内专注于 原...

公众号:Java后端 7148

【Altium Designer】Off grid pin解决方法

​今天我画完原理图编译时,出现了太多的黄色(出现warning警告提示)Off grid pin警告,这个警告并不是原理图电气连接出问题了,而是元器件或器件PIN脚没有和栅格对齐造成的原因。再编译还是出现这个警告。 最后经过不断翻阅网上经验和实践,才最终解决,本经验详细记录了解决该警告的有效方法。 解决方案:以下是问题解决步骤... ​

夜半少年的博客 7546

Spring面试题002

控制反转是应用于软件工程领域中的,在运行时被装配器对象来绑定耦合对象的一种编程技巧,对象之间耦合关系在编译时通常是未知的。在传统的编程方式中,业务逻辑的流程是由应用程序中的早已被设定好关联关系的对象来决定的。在使用控制反转的情况下,业务逻辑的流程是由对象关系图来决定的,该对象关系图由装配器负责实例化,这种实现方式还可以将对象之间的关联关系的定义抽象化。而绑定的过程是通过“依赖注入”实现的。控制反转是一种以给予应用程序中目标组件更多控制为目的设计范式,并在我们的实际工作中起到了有效的作用。依赖注入。

2401_87107140的博客 392

前言:关于作者吴秋生博士与此书简介

博士现为田纳西大学,诺克斯维尔分校,地理系的副教授。他的研究兴趣包括地理信息科学(GIS)、遥感和环境建模。更具体地说,对应用地理空间大数据、机器学习和云计算(例如,谷歌地球引擎、微软行星计算机)来研究环境变化,特别是地表水和湿地淹没动态。吴博士是开放科学和可重复研究的倡导者。他开发了几个用于高级地理空间分析的开源软件包(例如,吴博士还在YouTube上发布了数百个有关GIS和地图绘制的视频。更多有关他的开源项目信息,请访问GitHub(查看他的YouTube频道。.....................

韩天放 6085

一文吃透 SAP IDoc 状态码:从 TEDS1 到 WE02 排障,再到 ABAP 自动化监控

在 SAP 集成场景里,IDoc 往往是最常见、也最容易被低估的一条生命线:采购订单、发票、主数据、库存移动……只要系统之间要稳定地交换结构化业务数据,IDoc 就经常登场。真正让人头疼的,并不是 IDoc 本身,而是它在链路里到底走到了哪一步、卡在了哪里、该找谁背锅。这篇文章把常用的 IDoc 状态码按出站、入站拆开讲清楚,并且把每个状态对应的真实世界故障现象、排查入口、以及可以落地的 ABAP 监控代码串起来,让你看到状态码就能想到动作。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 404

2019最新《蚂蚁Java互联网架构师第2期教程》

0001-多线程快速入门.zip 0002-多线程线程安全.zip 0003-多线程之间通讯.zip 0004-java并发包&并发队列.zip 0005-线程池原理剖析&锁的深度化.zip 0006-数据交换格式&反射机制&SpringIOC原理分析.zip 0007-自定义注解与Java设计模式.zip 0008-Socket网络通讯基础.zip 0009-NI...

KEGUANGN的博客 306

运行 ui5 serve 命令行报错的处理方法

如果大家运行 ui5 serve 命令行,报如下的错误消息: ui5 不是内部或外部命令,也不是可运行的程序: 只需要执行命令行,全局安装 ui5 cli(command line interface)这个命令行工具即可: npm install --global @ui5/cli 这个 ui5 cli 的入口执行文件,实际安装在了我 Node.js 的安装目录下: 更多Jerry的原创文章,尽在:“汪子熙”: ...

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1340

Java最新高频刷题一,java面试大全笔记

由于文案过于长,在此就不一一介绍了,这份Java后端架构进阶笔记内容包括:Java集合,JVM、Java并发、微服务、SpringNetty与 RPC 、网络、日志 、Zookeeper 、Kafka 、RabbitMQ 、Hbase 、MongoDB、Cassandra 、Java基础、负载均衡、数据库、一致性算法、Java算法、数据结构、分布式缓存等等知识详解。本知识体系适合于所有Java程序员学习,关于以上目录中的知识点都有详细的讲解及介绍,掌握该知识点的所有内容对你会有一个质的提升,

2401_84584583的博客 674

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

java入门002~jdk的安装,java项目面试题

切莫死记硬背,小心面试官直接让你出门右拐1000道互联网Java面试题:

2401_84424453的博客 791

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

2018最新蚂蚁Java互联网架构师第2期视频教程

0001-多线程快速入门.zip 0002-多线程线程安全.zip 0003-多线程之间通讯.zip 0004-java并发包&并发队列.zip 0005-线程池原理剖析&锁的深度化.zip 0006-数据交换格式&反射机制&SpringIOC原理分析.zip 0007-自定义注解与Java设计模式.zip 0008-Socket网络通讯基础.zip 0009-NI...

weixin_44217055的博客 583

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

华为OD机试(41-60)老题库解析&Java源码系列连载ing_华为java机试题库及答案

在这里,由于面试中MySQL问的比较多,因此也就在此以MySQL为例为大家总结分享。

2301_79099287的博客 404

Java大厂面试真题:Spring Boot+微服务+AI架构三轮技术拷问全解析

从Spring Boot基础,到微服务高可用,再到AI原生应用,现代Java工程师需具备全栈视野。扎实的JVM、并发、Spring原理是根基,云原生与AI能力则是未来护城河。

w34583的博客 656

Java大厂面试实录:谢飞机怒怼Spring Cloud与AI微服务,结果笑晕了面试官!

大厂面试不仅考框架使用,更看重系统设计能力、问题边界意识和新技术敏感度。别做“谢飞机”,要做“真·架构师”!

2401_85724444的博客 598

Java大厂面试真题:Spring Boot微服务+Kafka消息队列+AIGC场景实战问答全解析

用户输入提示词 → 触发AI生成图文 → 异步处理 → 存储结果 → 支持语义化搜索核心挑战:响应延迟、系统解耦、语义理解、结果可信这场面试不仅考察了候选人的Java基本功,更重要的是检验其在现代云原生+AI融合系统中的架构思维能力。从同步阻塞到异步解耦,从关键字匹配到语义搜索,体现了技术演进的真实路径。如何合理选用技术栈应对业务需求消息队列在高并发场景下的关键作用AI工程化落地的核心挑战与解决方案如果你也能像战五渣一样“勉强过关”,说明你已经具备冲击大厂的潜力;

chenmingxing11的博客 1187

大忙人要看的书籍系列-2019-05

本次更新: 名称 提取码 备注 Spring Boot+Vue全栈开发实战 回复:042 JAVA核心知识点整理 回复:043 推荐 人人都是架构师 分布式系统架构落地与瓶颈突破 回复:044 推荐 实战Java高并发程序设计(第2版) 回复:045 可伸缩服务架构:框架与中间件) 回复:046 ...

盲目的拾荒者的博客 917

干货合集 | 500篇Java技术文章整理 | 建议打开

今天,给大家推荐一位Java架构领域做得非常好的朋友:师长。师长的公众号:Java进阶架构师这3年来累积了200篇优质原创文章,及各类优质技术文章共500篇。其号内专注于原理、架构设...

Java团长的博客 829

【高级架构师实战】Spring Cloud微服务大型电商架构亿级流(免费不加密)

第一版 001. 课程介绍以及高并发高可用复杂系统中的缓存架构有哪些东西? 002. 基于大型电商网站中的商品详情页系统贯穿的授课思路介绍 003. 小型电商网站的商品详情页的页面静态化架构以及其缺陷 004. 大型电商网站的异步多级缓存构建+nginx数据本地化动态渲染的架构 005. 能够支撑高并发+高可用+海量数据+备份恢复的redis的重要性 006. 从零开始在虚拟机中一步一步搭建一个4...

chenhuakang的博客 2170

ContextMenuManager 右键菜单管理指南:三步清理与自定义

右键一弹,几十个陌生选项挤在一起:卸载已久的软件还赖在菜单里,真正常用的条目反而要翻两屏才找得到。ContextMenuManager 是一款纯图形化的右键菜单管理程序,用鼠标开关就能完成禁用、改名和自定义新增,全程不用打开注册表。 ## 🎯 ContextMenuManager 是什么:三句话讲清 它是一个免费开源(GNU GPLv3)的 Windows 右键菜单管理程序,C# 编写,覆盖

gitblog_00066的博客 1099

Java大厂面试全解析:从JVM到AI Agent,谢飞机的搞笑面试实录

混淆工具与原理:知道用Spring Boot,但不懂自动装配原理;知道用Redis,但不懂持久化机制。停留在表面:能说出名词,但无法解释技术选型背后的业务权衡(如为何选Kafka而非RabbitMQ)。拒绝学习前沿:AI Agent、RAG已成大厂标配,仍停留在‘会用Copilot=懂AI’的阶段。

qq_54076831的博客 959

Java大厂面试实录:从Spring Boot到AI Agent的电商全栈技术深度解析

李总(技术总监,严肃认真):张三(自称"全栈大神",实则水货程序员)

2203_75649690的博客 544
上一篇: Java微服务架构师_Java 并发编程_001
下一篇: Java微服务架构师_Java 并发编程_003
Coder_Boy_
博客等级 码龄10年 2804粉丝 819原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Coder_Boy_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值