java多线程(七)

S7-200SMART系列全套接线说明 SMART200接线方法,输入,输出,模拟量,面板,扩展糟等,并且详细说明接线原理。 阅读详情

java多线程编程(七)

  重排序对多线程的影响

这一节,看一下重排序对多线程的影响。

示例代码:

class ReorderExample{
	int a=0;
	boolean flag = false;
	public void writer(){
		a=1;   		//1
		flag=true;	//2
	}
	public void reader(){
		if(flag){		//3
			int i= a*a;	//4
			......
		}
	}
}

flag 变量是个标记,用来标记变量a是否已被写入。这里假设有两个线程A和B,A首先执行writer()
方法。随后B线程接着执行reader()方法。线程B在执行操作4时,能否看到线程A在操作1对共享变量a
的写入呢?
答案是:不一定能看到。

由于操作1和操作2没有数据依赖关系,编译器编译器和处理器可以对这两个操作重排序;
同样,操作3和操作4没有数据依赖关系,编译器和处理器也可以对这两个操作重排序。
让我们先来看看,当操作1和操作2重排序时,可能会产生什么效果?请看下面的程序执行时序图,如图所示。

在这里插入图片描述

如图所示,操作1和操作2做了重排序。程序执行时,线程A首先写标记变量flag,随后线
程B读这个变量。由于条件判断为真,线程B将读取变量a。此时,变量a还没有被线程A写入,在
这里多线程程序的语义被重排序破坏了!

下面再让我们看看,当操作3和操作4重排序时会产生什么效果(借助这个重排序,可以顺
便说明控制依赖性)。下面是操作3和操作4重排序后,程序执行的时序图,如图所示

在这里插入图片描述

 在程序中,操作3和操作4存在控制依赖关系。当代码中存在控制依赖性时,会影响指令序
列执行的并行度。为此,编译器和处理器会采用猜测(Speculation)执行来克服控制相关性对并
行度的影响。以处理器的猜测执行为例,执行线程B的处理器可以提前读取并计算a*a,然后把
计算结果临时保存到一个名为重排序缓冲(Reorder Buffer,ROB)的硬件缓存中。当操作3的条
件判断为真时,就把该计算结果写入变量i中。

从图2中我们可以看出,猜测执行实质上对操作3和4做了重排序。重排序在这里破坏了
多线程程序的语义!

在单线程程序中,对存在控制依赖的操作重排序,不会改变执行结果(这也是as-if-serial
语义允许对存在控制依赖的操作做重排序的原因);但在多线程程序中,对存在控制依赖的操
作重排序,可能会改变程序的执行结果。

利用ArcGIS快速生成等高线边界,完成地形图拼图 地形图边界一般在CAD中手动绘制,然而,一幅边缘复杂的地形图边界的绘制需要花费大量时间和精力,为了减少重复性工作,提高效率,用ArcGIS软件可以自动生成实测地形图的边界 阅读详情

相关推荐

ETL第八章无人售货机零售项目实践

ETL实战项目——无人售货机

m0_52058217的博客 4418

【Java】实验七 多线程

实验七 多线程

2201_75406816的博客 985

Unity性能优化 - 动态图集

Unity 动态图集是 Unity 引擎中用于处理游戏纹理优化的一种技术。本文介绍了什么是动态图集,动态图集的优缺点,以及提供了一套完整的代码供大家参考。

qq_33808037的博客 4840

JAVA多线程⑦

JAVA多线程⑦线程的生命周期及状态转换线程的优先级同步代码块死锁 个人笔记⑦ 线程的生命周期及状态转换 当线程被创建以后,它不是一启动(start)就进入运行 状态的,也不是一直处于执行状态。在线程的生命周期 中,它要经过创建(New)、就绪(Runnable)、运行 (Running)、阻塞(Blocked)和死亡(Dead)这五 种状态。当线程进入运行状态后,它不是一直“霸占” CPU运行,一般的操作系统是采用抢占式的方式来让线 程获得CPU。所以CPU需要在多条线程之间切换,于是 线程状态也会多

qq_52563919的博客 361

立创开源:基于STM32F407的大疆M30T无人机PSDK机载开发板硬件设计与飞行控制实现

本文详细介绍了基于STM32F407微控制器为大疆M30T无人机设计PSDK机载开发板的完整流程。从关键的E-Port接口电路设计、电源保护,到STM32最小系统搭建,再到通过PSDK实现与无人机的通信及基础飞行控制,提供了从硬件到软件的全栈实战指南,助力开发者快速入门无人机负载开发。

weixin_35649491的博客 401

2025-E题国一-简易自行瞄准装置:基于嘉立创地猛星/天猛星与K230的视觉巡线云台系统设计

本文详细介绍了2025年全国大学生电子设计竞赛E题一等奖作品——基于嘉立创地猛星/天猛星与K230的视觉巡线云台系统设计。该系统通过地猛星主控实现小车巡线,天猛星主控驱动云台,结合K230开发板的视觉识别能力,构建了一套完整的视觉巡线云台系统,实现了自动巡线与精准瞄准功能。文章深入剖析了硬件选型、双闭环PID控制算法、视觉识别与目标跟踪等核心技术,并分享了系统调试与避坑经验。

weixin_42596011的博客 674

Java多线程学习(七)

Java多线程学习(七) 2020.3.3学习总结 1.为什么要使用线程池 线程池优势:线程池做的工作只要是控制运行的线程数量,处理过程中将任务放入队列,然后在线程创建后启动这些任务,如果线程数量超过了线程池的最大线程数量,超出数量的线程排队等候,等其他线程执行完成后,再从队列中取出任务来执行。 它的主要特点是:线程复用,控制最大并发数,管理线程。 降低资源消耗。通过重复利用已创建的线程降低线程...

weixin_43395911的博客 323

阻抗匹配与史密斯(Smith)圆图

在找到点B和B'后,我们就能够测量A'到B和B'到D的弧长,前者就是C的归一化电纳值,后者为L的归一化电抗值。当然,表面上看新的点好像是一个不同的阻抗,实际上Z和1/Y表示的是同一个元件(这个新值在圆图上呈现为一个不同的点,而且反射系数也不相同,依次类推)。出现这种情况的原因是我们的图形本身是一个阻抗图,而新的点代表的是一个导纳。这个方程是在复平面(Γr, Γi)上、圆的参数方程(x - a)² + (y - b)² = R²,它以[r/(r + 1), 0]为圆心,半径为1/(1 + r)。

qq_55759599的博客 3962

Java程序设计实验七 Java多线程机制

Java程序设计实验七 ava多线程机制 实验内容(实验方案、实验步骤、设计思路等) 1. 实验方案:在IDEA中编写代码,运行检验,看结果是否符合预期。 2. 实验步骤:在书上找到相关技术算法的描述,然后建立Java项目、包、类,编写代码,不断调试并检验,完成实验报告。 3. 设计思路:先建立一个主类WorkingSpace,然后再建立一个Create类,实现四个线程同时访问一个变量,不断调试,直至结果不出问题。

萌新程序猿的博客 1343

【法如faro】三维激光软件Scene2023数据处理(自动配准并转换坐标)流程

法如faro Scene2023数据处理(自动配准并转换坐标)的主要流程为:新建项目、导入数据、处理、自动注册、坐标系转换、模型导出立和面模型导出等。

智慧空间实验室 2383

华为OD机试2025A卷 - BOSS的收入(Java & Python& JS & C++ & C )

华为OD机试2025A卷 - BOSS的收入(Jav一个XX产品行销总公司,只有一个boss,其有若干一级分销,一级分销又有若干二级分销,每个分销只有唯一的上级分销。规定,每个月,下级分销需要将自己的总收入(自己的+下级上交的)每满100元上交15元给自己的上级。现给出一组分销的关系,和每个分销的收入,请找出boss并计算出这个boss的收入。输入:分销关系和收入:[[分销id 上级分销id 收入], [分销id 上级分销id 收入], [分销id 上级分销id 收入]]输出:[boss的ID, 总收入]

算法大师! 1171

java线程(七),Java 多线程(七)

Java 多线程(七)Java 多线程(七)2019独角兽企业重金招聘Python工程师标准>>>1.理解程序、进程、线程的概念程序可以理解为静态的代码。进程可以理解为执行中的程序。(任务管理器中可以看到进程)线程可以理解为进程的进一步细分,程序的一条执行路径2.如何创建java程序的线程(重点)方式一:继承Thread类//创建多线程的方式一:继承于Thread类classP...

weixin_39604598的博客 91

【Qt开发教程】网络代理QNetworkProxy类详解及实战应用

QNetworkProxy 提供了一种灵活而强大的方式来配置和管理网络代理,通过设置代理类型、主机、端口和认证信息,可以使应用程序的所有网络请求通过代理服务器进行。结合 QNetworkProxyFactory 可以实现动态代理选择和自动配置,提高应用的网络通信能力和安全性。在实际应用中,通过合理设置代理、处理代理认证和错误情况,可以确保应用程序在复杂的网络环境中稳定运行,为用户提供可靠的网络访问体验。

科技改变人类,技术成就未来 1542

java复习七:多线程

​ 1 线程执行同步代码块或同步方法时,程序调用Thread.sleep()方法或者Thread.yield()方法暂停当前线程。​ 2 线程执行同步代码块时,其他线程调用了该线程的suspend()方法将该线程挂起,该线程不会释放锁。不同的线程分别占用对方需要的同步资源不放弃,都在等待对方放弃自己需要的同步资源,就形成了线程的死锁。​ 4 在同步代码块或者同步方法中执行了线程对象的wait()方法之后,线程暂停,并释放锁。2 程序需要实现一些等待的任务时,如用户输入,文件读写。...

zf111212的博客 226

深度学习工具包 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")

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

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

java(七) ——多线程

java线程的初步学习,主要是创建以及Thread的几个常用方法以及一个窗口卖票的案例

java能飞翔 528

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Java多线程——<七>多线程的异常捕捉

Java多线程——<七>多线程的异常捕捉

w36680130的博客 135

Java基础(七) 多线程

目录 进程与线程 并行与并发 JVM的多线程 实现多线程的两种方式 继承Tread类 实现Runnable接口 匿名内部类实现多线程 线程操作 自定义线程名 休眠线程 守护线程 加入线程 线程同步 同步代码块 互斥 锁与synchronized 同步方法 实战——模拟卖票 死锁 线程安全类 进程与线程 当你运行一个程序,系统就在内存中创建了一个进程(pr...

戏流年的博客 378

(Java)实验七 多线程

一、实验目的 1、掌握Java多线程结构和开发过程。 2、了解多线程生命周期和运行机制。 二、实验内容 1、用继承Thread类实现多线程;  2、用实现Runnable接口实现多线程。 三、实验过程 代码1: class MyThread extends Thread{ private String name; public MyThread(String name) { this.name=name; } public void run() { for(int i=0;i<

weixin_44209522的博客 535

七、Java多线程与并发

JAVA平台为程序员提供了并发编程所需的功能强大的API,呵呵,就像一块奶油蛋糕般刺激你的味蕾同时又挑战你将体重控制在某个水平的信念,该篇及后续文章展示Java 多线程与并发编程的诱人之处,帮助理解Java并发编程的模式,以及如何更精确地使用线程模型。 Java 线程基础 一、锁         锁提供两种主要特性:互斥(mutual exclusion) 和可见性(visibility)。

1183

Java多线程是什么?七大线程状态总结

大家好,我是chowley,马上大年三十了,提前祝大家新春快乐,这篇来总结一下Java多线程方面内容。在Java编程中,多线程是一种重要的特性,它允许程序同时执行多个任务,从而提高程序的性能和效率。在多线程编程中,了解线程的状态是至关重要的。Java多线程是指在Java程序中同时运行多个线程,每个线程都独立执行自己的任务。通过多线程,可以将耗时的任务分配给不同的线程来执行,从而提高程序的并发性和响应速率。Java多线程是一种重要的编程特性,通过多线程可以实现系统并发执行多个任务的能力。

chowley的博客 635

Java经典面试题汇总(七)多线程

本篇总结的是Java多线程相关的面试题,后续会持续更新,希望我的分享可以帮助到正在备战面试的实习生或者已经工作的同行,如果发现错误还望大家多多包涵,不吝赐教,谢谢~ 1.并行和并发有什么区别? 并行:多个处理器或多核处理器同时处理多个任务。 并发:多个任务在同一个 CPU 核上,按细分的时间片轮流(交替)执行,从逻辑上来看那些任务是同时执行。 并发 = 两个队列和一台咖啡机。 并行 = 两个队列和两台咖啡机。 2. 线程和进程的区别? 一个程序下至少有一个进程,一个进程下至少有一个...

nbme的博客 6552

Java多线程七

1 synchronized的缺陷 参考:Java并发编程:Lock    synchronized是java中的一个关键字,也就是说是Java语言内置同步的特性。那么为什么会出现Lock呢?    如果一个代码块被synchronized修饰了,当一个线程获取了对应的锁,并执行该代码块时,其他线程便只能一直等待,等待获取锁的线程释放锁,而这里获取锁的线程释放锁只会有两种情况:  1.

NicolasYan的专栏 509

JAVA多线程(七)Java多线程之synchronized(同步锁)

1.JAVA多线程(七)Java多线程之synchronized(同步锁) 1.1 synchronized(同步锁)   synchronized关键字解决的是多个线程之间访问资源的同步性,synchronized关键字可以保证被它修饰的方法或者代码块在任意时刻只能有一个线程执行。 另外,在 Java 早期版本中,synchronized属于重量级锁,效率低下,因为监视器锁(monitor)是依...

yuan_xw的专栏 897

Java多线程(七)-多线程的异常捕捉

一、概述   为什么要单独讲多线程的异常捕捉呢?先看个例子: public class ThreadException implements Runnable{ @Override public void run() { throw new RuntimeException(); } //现象:控制台打印出异常信息,并运行一段时间后才...

lisheng19870305的专栏 1924

Java学习七-多线程

概念 注意:很多多线程是模拟出来的,真正的多线程是指有多个cpu,即多核,如服务 器。如果是模拟出来的多线程,即在一个cpu的情况下,在同一个时间点,cpu只能 执行一个代码,因为切换的很快,所以就有同时执行的错觉。 线程就是独立的执行路径; 在程序运行时,即使没有自己创建线程,后台也会有多个线程,如主线程,gc线程; main() 称之为主线程,为系统的入口,用于执行整个程序; 在一个进程中,如果开辟了多个线程,线程的运行由调度器安排调度,调度器是与操作系统紧密相关的,先后顺序是不能认为的干预的。 对同

天天向上 212

Java多线程之七锁

dfg

u011411283的专栏 337

JAVA语言 实验七 多线程

在方法中,检查是否还有余票,如果有,模拟售票过程,打印卖票信息,并返回 true;在卖票的过程中,调用 TicketBox 的 sellTicket 方法进行实际的售票操作。假设有100张火车票,创建10个线程模拟10个售票点,每个售票点100毫秒卖一张票,打印出售票过程,注意使用synchronized确保同一张票只能卖出一次。创建10个售票点线程,每个线程都是一个 TicketSeller 对象,共享同一个票箱。构造方法用于初始化售票点,接收售票点的名称和所属的票箱。2、掌握多线程的互斥与同步。

weixin_49238668的博客 465
上一篇: java多线程编程(六)
下一篇: java网络编程(一)
Round_Yuan
博客等级 码龄10年 26粉丝 78原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值