多线程死锁 危害 解决方案

多线程-死锁定位以及如何避免死锁(银行家算法) 什么是死锁: 死锁是指两个或两个以上线程在执行过程中,由于竞争资源而造成的阻塞问题,若无外力作用下,他们将无法推荐下去,此时系统处于死锁状态。 死锁的危害: 导致程序得不到正确的运行结果:因为程序产生死锁,发生阻塞,不会继续向下执行。 浪费资源:产生死锁,最少有两个线程会发生阻塞。 产生新的死锁:产生死锁的线程会一直占有锁资源,会导致其它尝试获取该锁的线程也发生死锁,产生多米诺效应。 死锁产生... 阅读详情

1 什么是死锁?

两个或以上线程或进程在执行过程中,因争夺资源而造成互相等待的现象,若无外力作用

,它们将无法推进下去。

产生死锁的条件(同时满足)循不互请?

互斥:共享资源a和b只能被一个线程占用(无法破坏)

请求和保持:线程T1已经获得共享资源a,在等待共享资源B的时候,不释放共享资源a(在首次执行时一次性申请所有的资源)

不可她占:其他线程不可强行抢占T1占有的资源(主动释放线程占有的资源)

循环等待:线程T1等待线程T2占有的资源,线程T2等待线程T1占有的资源,这造成循环等待(按顺序申请资源来预防死锁的产生)

如A B 两个线程争夺刀叉。

A 拿到刀,然后去争夺叉。  B拿到叉去争夺刀。

这个时候A争夺的叉被B拿到已经锁住了,而B争夺的的刀也被A拿到锁住了。就一直等待,造成死锁。

解决方案:刀和叉要有顺序。当去争夺叉的时候,必须先拿到刀。

这样就可以避免死锁了。

死锁危害:

1死锁会使进程得不到正确的结果

2 死锁会使资源利用率降低。相互等待的线程不可用(如本来有5个线程工作,现在2个线程卡住了,只有3个线程能工作了)

3 死锁还会导致产生新的死锁

多线程系列(五) -死锁分析及解决办法介绍 在之前的文章中,我们介绍了synchronized同步锁关键字的作用以及相关的用法,它能够保证同一时刻最多只有一个线程执行修饰的代码段,以实现线程安全执行的效果。但是如果过度的使用synchronized等方式进行加锁,程序可能会出现死锁现象。 阅读详情

相关推荐

Depth Anything 3实战:如何用DINOv2 Transformer一键生成3D高斯点云?

本文详细介绍了Depth Anything 3(DA3)模型如何利用DINOv2 Transformer架构,实现从单张或多视角图像一键生成高质量3D高斯点云。DA3通过统一的深度-射线表示和自适应注意力机制,简化了传统复杂的3D重建流程,并可直接微调用于3D高斯渲染,为图形学、CV和内容创作领域提供了高效的端到端解决方案。

postgres8guard的博客 722

linux线程的死锁

一般情况下,如果同一个线程先后两次调用lock,在第一次调用时,由于锁已经被占,该线程会挂起等待别的线程释放锁,然而锁正是被自己占着的,该线程又被挂起,没有机会释放锁,因此,就永远处于挂起等待状态了,这叫做死锁(Deadlock)。另种典型的死锁情形是这样线程A获得了锁1,线程B获得了锁2,这时线程A调用lock试图获得锁2,结果是需要挂起等待线程B释放锁2,而这时线程B也调用lock试图获得锁1,结果是需要挂起等待线程A释放锁1,于是线程A和B都永远处于挂起状态了。...

qq_58264156的博客 659

工业金属表面缺陷检测:4种光学成像方案(明/暗/漫/背光)选型与实测对比

本文深入探讨工业金属表面缺陷检测中的4种光学成像方案(明/暗/漫/背光),详细解析其物理原理、适用场景及实测效果。通过对比不同照明方案在铝合金轮毂、不锈钢餐具等实际工业场景中的表现,提供科学的选型决策树,帮助提升缺陷检出率至99%以上,为计算机视觉在工业质检领域的应用提供实用指南。

weixin_33624741的博客 388

死锁现象和特点,解决死锁的方法

死锁现象和特点,解决死锁的方法

weixin_52014130的博客 1774

Xilinx Chip2Chip IP核实战:Aurora PHY通信配置与仿真避坑指南

本文深入解析Xilinx Chip2Chip IP核与Aurora PHY的通信配置与仿真优化,提供实战避坑指南。通过AXI协议转换桥实现FPGA间高速数据传输,详细讲解Aurora PHY参数设置、仿真加速技巧及常见问题解决方案,帮助工程师快速部署稳定高效的芯片间通信系统。

g5h6i7j的博客 1006

FMQL开发环境实战:从零构建国产FPGA SoC的软件基石

本文详细解析了构建国产复旦微FMQL FPGA SoC软件开发环境的完整流程。针对开发者在环境搭建中遇到的核心痛点,文章深入剖析了Procise、IAR与Vivado三大工具的协同角色与版本选择,提供了从软件下载、安装避坑到核心配置的实战指南,并总结了常见问题的排查方法,旨在帮助开发者高效跨过FMQL开发的“第一道坎”。

weixin_29215391的博客 125

产生死锁其他线程能做什么

如何预防死锁: 1、线程一定要按照一定的顺序进行加锁。 2、加锁时间,一个线程在获取锁的时候设置时间,超过一定的时间没有获取到锁的时候,就放弃对该锁的请求,并释放自己的锁。这里可以使用高级锁【J.U.C】 3、死锁监测。一般不会使用 产生死锁其他线程能做什么: 1、释放所有锁,回退,等待一段时间重试。时间是随机的。 2、给死锁线程设置优先级,让一个或几个线程回退,那么其他线程就可以以后没有死锁,继...

weixin_43538215的博客 315

「UG/NX」Block UI 曲线收集器CurveCollector

曲线收集器块用于选择一条或多条曲线,包括通过选择意图连接的末端曲线链。曲线选择意图用于此块,但它不支持“交点处停止”、“跟随圆角”、“中间链”和“特征内链”等规则选项。

何曾参静谧的博客 1087

浅谈对死锁的理解

本文的目的是深入浅出地介绍死锁问题,包括死锁的定义、特点、原因和解决方法。我们将通过实例代码和图表来说明死锁问题,并提供一些实用的解决方案,以帮助读者更好地理解和解决死锁问题。

qq_51264307的博客 830

【unity游戏开发入门到精通——通用篇】Post Processing 后处理插件Post-process Volume 和 Volume最全基础使用说明

之前我已经实现了不少后处理功能,本文其实就是将他们归类整理,以便更好的查找和理解。在Unity中,后处理(Post-Processing)是在相机所捕捉的图像上应用一些特殊效果的过程,后处理会让图像视觉效果更好(前提是做的好)。这些效果的范围有非常细微的颜色调整,也包括整体的美术风格的大修,可以让场景看起来更加真实或风格化,或者只是变得更好看。就像我们都会用手机拍照,但很多时候我们拍的原始的相片都打不到我们想要的效果。比如照片可能亮度不够,颜色不饱和或者对比度不好等。

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 7894

【ARMv8 异常模型入门及渐进7 - GIC及安全中断介绍】

GIC-v3中,引入了支持2种安全状态(secure state),也就是对于中断,根据secure状态,分为安全中断和非安全中断。当然也可以只支持一种安全状态。这里的2种安全状态和1种安全状态,主要是影响中断分组,所使用IRQ和FIQ管脚的映射,以及gic中的寄存器访问。

CodingCos的博客 2116

Java中的死锁

在Java中使用多线程,就会有可能导致死锁问题。死锁会让程序一直卡住,不再程序往下执行。我们只 能通过中止并重启的方式来让程序重新执行。这是我们非常不愿意看到的一种现象,我们要尽可能避免 死锁的情况发生! 死锁的四个必要条件 1、互斥条件:指进程对所分配到的资源进行排它性使用,即在一段时间内某资源只由一个进程占用。如 果此时还有其它进程请求资源,则请求者只能等待,直至占有资源的进程用完释放。 2、请求和保持条件:指进程已经保持至少一个资源,但又提出了新的资源请求,而该资源已被其它进程

Java 391

波浪补偿控制(AHC)之波浪发生器(CODESYS完整源代码)

波浪发生器平台详细算法和结构介绍请参看下面博客文章:CODESYS平台如何建立FC和FB,请参看下面博客文章:

RXXW_Dor的博客 401

死锁猎人:多线程江湖的生死对决

死锁不是魔鬼,而是多线程编程必须面对的挑战。通过系统的学习和实践,我们可以从容应对各种死锁场景。核心修炼要诀预防胜于治疗:设计阶段就要考虑死锁问题工具为王:熟练掌握各种调试和检测工具实践出真知:在实际项目中积累经验持续学习:跟上新技术和最佳实践面试制胜法宝能清晰描述死锁的四个条件会用图表分析复杂的死锁场景掌握多种预防和解决策略有实际的调试和修复经验能结合具体业务场景设计方案在这个多核并发的时代,掌握了死锁的奥秘,你就掌握了多线程编程的核心技能。

苦哈哈的 C++ 程序员,写这个技术博客不是为了装逼,也不是为了立人设,是为了收割流量 988

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

多线程就一定快吗?

介绍了多线程情况下, 程序运行速度不一定会变快的一些案例.

随便写点C++和JAVA的知识 1126

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

java object转double_Java 线程(3)- 线程共享

当使用多线程时,当多个线程同时操作同一个变量时,由于竞争条件(race condition)可能破坏该变量的状态,导致一致性问题,而如果多线程之间依赖同一资源,则各线程之间可能会陷入 Liveness Hazards 线程安全即在多线程的环境下, 无论线程以何种方式使用该对象, 都不会引起错误, 并且对该对象的使用者而言无需额外添加同步或其它条件确保一致性确保线程间的一致性,最有效的方法是减少(...

weixin_31188325的博客 156

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

你不可不知的10个实时系统陷阱:第3个就是信号量优先级反转

掌握实时系统设计关键陷阱的应对策略,深入解析C语言多线程信号量的优先级反转问题,涵盖嵌入式系统中的典型应用场景与优先级继承等核心解决方法,有效提升系统稳定性与响应效率,值得收藏。

StepLens的博客 1114

为什么高优先级线程会被低优先级“卡住”?:C语言信号量设计的致命盲区

深入解析C语言多线程信号量的优先级反转问题,揭示高优先级线程被低优先级“卡住”的根本原因。涵盖实时系统中的典型应用场景、避免资源争用的核心方法及互斥机制优化策略,提升系统稳定性与响应效率,值得收藏。

QuickTrans的博客 887

Java多线程 死锁含义,死锁的危害,墨菲定律

文章目录死锁的含义死锁的影响死锁的危害--墨菲定律 死锁的含义 死锁是一定发生在并发中的. 互不相让: 当两个或者更多的线程(或进程)相互持有对方所需要的资源, 又不主动释放锁, 导致所有人都无法继续执行下去, 导致程序陷入无尽的阻塞, 这就是死锁. 例如下图,线程A持有锁1 ,想去拿锁2, 线程B持有锁2, 想去拿锁1, 但是此时释放都不释放自己的锁, 那么就会进入无尽的阻塞. 锁的特性是只能被一个线程所拥有 如果多个线程之间的依赖关系是环形, 存在环路的锁的依赖关系, 那么也可能会发生死锁. 如下

Java持续实践 987

Java多线程与高并发专题——死锁是什么?如何写一个必然死锁的例子?发生死锁必须满足哪 4 个条件?

Java多线程与高并发专题——死锁是什么?如何写一个必然死锁的例子?发生死锁必须满足哪 4 个条件?

从知识输入到知识输出 1241

Java多线程之死锁、活锁与饥饿

文章目录Java多线程之死锁死锁的影响死锁的四个必要条件如何定位死锁修复死锁的策略线上发生死锁应该怎么办常见修复策略避免策略哲学家就餐问题多种解决方案检测与恢复策略死锁检测算法死锁恢复机制鸵鸟策略实际工程中如何避免死锁其他活性故障活锁什么是活锁如何解决活锁问题工程中的活锁实例:消息队列饥饿 Java多线程之死锁 死锁发生在并发情况中,当两个(或者多个)线程(进程)相互持有对方所需要的资源,又不主动...

bob_man的博客 3365

什么是死锁?如何预防死锁?

是指在多线程或多进程程序中,多个进程或线程在执行过程中,因争夺资源而造成一种相互等待的状态,从而导致程序无法继续执行。

qq_45906596的博客 934

java多线程 死锁_Java多线程 死锁含义,死锁的危害,墨菲定律

死锁的含义死锁是一定发生在并发中的.互不相让: 当两个或者更多的线程(或进程)相互持有对方所需要的资源, 又不主动释放锁, 导致所有人都无法继续执行下去, 导致程序陷入无尽的阻塞, 这就是死锁.例如下图,线程A持有锁1 ,想去拿锁2, 线程B持有锁2, 想去拿锁1, 但是此时释放都不释放自己的锁, 那么就会进入无尽的阻塞.锁的特性是只能被一个线程所拥有如果多个线程之间的依赖关系是环形, 存在环...

weixin_39966225的博客 122

Linux C++编程死锁排查

在 Linux 环境下进行 C++ 编程时,多线程能显著提升程序的并发处理能力,让程序在面对复杂任务时表现得更加高效。但多线程编程并非一帆风顺,死锁问题就像隐藏在暗处的 “杀手”,随时可能让程序陷入僵局。想象一下,你的程序原本运行得好好的,突然就像被施了定身咒一样,毫无反应,所有的线程都被卡住,无法继续推进。这很可能就是死...

计算机毕业论文源码,学生个人网页制作html源码。贴近用户做网络推广和互联网优化。 1256

深入解析 Linux 死锁:原理、检测与解决方案

死锁是指两个或多个进程 / 线程因循环等待对方持有的资源而陷入永久阻塞的状态。必要条件核心机制Linux 系统实例互斥条件资源具有独占性,同一时间仅允许一个进程使用内核自旋锁(spinlock)在中断上下文的独占访问;文件系统写锁阻塞其他进程写操作持有并等待条件进程持有部分资源,同时等待其他资源线程 A 持有 mutex1 并申请 mutex2,线程 B 持有 mutex2 并申请 mutex1(ABBA 死锁)不可剥夺条件资源只能由持有者主动释放,不可强制剥夺。

zqmgx13291的博客 1280

cppbestpractices死锁预防:C++多线程死锁的避免策略

你是否曾在C++多线程程序中遭遇过神秘的程序冻结?是否花数小时调试却发现线程间相互等待资源?本文基于[cppbestpractices项目](https://link.gitcode.com/i/f1d18e578f5dfb9f5bfe13b7e2373f8b)的核心指南,结合[线程安全性章节](https://link.gitcode.com/i/f1d18e578f5dfb9f5bfe13b7...

gitblog_00615的博客 852
上一篇: Java内存模型(Java Memory Model简称JMM)
下一篇: redis高可用几种方案
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

阿甘带你学java

感谢支持

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

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

打赏作者

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

抵扣说明:

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

余额充值