刷完这份“宝藏”级的高并发笔记与JDK源码剖析手册,我感觉我精通了

刷完这份“宝藏”级的JDK源码剖析手册,我感觉我精通了 由于篇幅限制就只能为大家展示到这里了,需要的小伙伴可以点击下方的名片自取! 阅读详情

最近小编在学习过程中无意间发现两份“宝藏”级的高并发资料,涵盖内容非常之多且深入浅出。本着雷锋精神在此分享给小伙伴们,希望你们看完都能“精通”高并发。

第一份:JDK源码剖析手册

基于JDK7和IJDK 8,对整个Concurrent包进行全面的源码剖析。JDK 8中大部分并发功能的实现和JDK 7一样,但新增了一些额外的特性。例如CompletableFuture、ConcurrentHashMap的新实现、StampedLock、 LongAdder等。

总览

详细内容展示

因为篇幅有限制,在此只截图展示了

第二份:深入理解高并发编程

总览

详细内容展示

告别低级CRUD!Java进阶圣经深度解析:从JVM到架构,助你直击大厂面试核心! 做了几年CRUD,感觉自己像个“API调用工程师”,对底层原理一知半解,想深入却不知从何入手?每次面试都止步于基础知识,一问到JVM、并发、分布式、微服务底层原理,就开始“支支吾吾”,错失心仪Offer?平时学习零零散散,看过不少博客、教程,但知识点不成体系,总感觉东一榔头西一棒子,无法形成完整的知识图谱?憧憬着未来能成为一名独当一面的架构师,却发现自己对高并发、高可用、可伸缩等设计理念缺乏实战经验和理论支撑?如果你的答案是“YES”,那么恭喜你,你找对地方了! 阅读详情

相关推荐

Java反序列化漏洞实战:从ysoserial利用链到Burp Collaborator无回显验证

序列化与反序列化是Java中用于对象持久化和网络传输的核心机制,其原理是将对象状态转换为字节流,并在需要时重建。然而,当重写的readObject()方法包含危险逻辑且反序列化数据源可控时,便构成了严重的安全漏洞。攻击者可构造恶意序列化数据,触发从起点类(如HashMap)到终点类(如TemplatesImpl)的链式调用(Gadget Chain),最终实现远程代码执行。这一技术价值在于其危害性高,常能直接获取服务器权限,是渗透测试中的关键攻击面。在应用场景上,尤其在无回显(Blind)环境下,漏洞验证成

weixin_32428571的博客 273

阿里大佬珍藏并发编程笔记,由浅入深剖析JDK源码,终于搞到手了

都说年关难过,现在真的深有体会! 眼看就快要拿着年终奖美美地回家过年了,还是没抗住阳了个阳,更惨的是,打工人发烧躺床,还等来了HR的裁员通知……身体心灵双重打击,一遍等康复一遍等赔偿,这过程太煎熬了。

老男孩的架构路 456

XXE漏洞深度解析:从XML外部实体注入原理到实战攻防

XML作为广泛应用的数据交换格式,其解析机制是Web应用安全的关键环节。XML解析器在处理文档类型定义时,若配置不当,可能允许加载外部实体,从而引发外部实体注入漏洞。这一漏洞的核心原理在于攻击者能够控制外部实体的URI,诱导解析器访问本地文件或内部网络资源,实现敏感信息窃取或内网探测。其技术价值在于揭示了数据格式解析功能被滥用的风险,是服务端请求伪造和文件读取类漏洞的典型代表。在应用场景上,XXE常见于处理XML输入的API接口、文件上传解析以及单点登录等模块。本文聚焦XXE漏洞的深度利用与防护,结合盲XX

weixin_33769125的博客 1240

【死磕JDK源码】ThreadPoolExecutor源码保姆级详解

位运算表示线程池状态,因为位运算是改变当前值的一种高效手段。 线程池状态 Integer 有32位: 最右边29位表工作线程数 最左边3位表示线程池状态,可表示从0至7的8个不同数值 线程池的状态用高3位表示,其中包括了符号位。五种状态的十进制值按从小到大依次排序为: RUNNING < SHUTDOWN < STOP < TIDYING <TERMINATED 这就能通过比较值的大小来确定线程池的状态。 例如程序中经常会出现isRunning的判断: 000-11111

JavaEdge全是干货的技术号 3355

Java反编译工具全解析:从Fernflower到Bytecode Viewer的实战指南

Java反编译是将编译后的字节码文件转换回可读源代码的关键技术,其核心原理在于解析.class文件结构并重构高级语言逻辑。这项技术在软件维护、安全审计和学习研究中具有重要价值,尤其在分析第三方库、排查运行时问题或进行漏洞检测时不可或缺。主流的反编译引擎如Fernflower、CFR和Procyon各有侧重,其中Fernflower以高可读性著称,被集成在IntelliJ IDEA中,而CFR则优先支持Java新特性。图形化工具如JavaDecompileTool-GUI和Bytecode Viewer(BC

weixin_30572613的博客 312

WSL2不能上网,Failed to connect to github.com port 443问题解决方案

WSL2不能上网: 问题:ping外网无效 例如:ping www.baidu.com失败 解决方案: 在wsl: $sudo vi /etc/wsl.conf wsl.conf: [network] generateResolvConf = false 在PowerShell: $sudo vi /etc/etc/resolv.conf resolv.conf: # This file was automatically generated by WSL. To stop automatic gen

Jason_Chen__的博客 9525

终于不慌内卷了,多亏阿里内部的并发图册+JDK源码速成笔记

对于多线程的以及各种并发的设计原理很多小伙伴其实并没有深刻的理解;更多的只是面试前刷刷面试题。但是你要是想要将自己的技术内功提升一个档次的话,上面的两份文档一定能对您有所帮助!

Java架构师之路的博客 200

大疆M3508电机使用CAN通信进行速度PID闭环控制详解

目录一. 简介二. 电机通信协议三. 电机PID控制原理四. 官方代码移植-中断接收五. 官方代码移植-查询接收 一. 简介 之前写过一篇文章STM32实现四驱小车(五)电机控制任务——电机速度PID控制算法,其中是以大疆的M3508电机为例进行讲解的(没错,就是RoboMaster机器人同款电机,不过Robomaster上的电机好像是小一号的M2006)。不少小伙伴私信问我要代码,我都回复说不是有官方demo么。后来问的人多了我大概明白了,看来官方的Demo还是有点门槛。可能是带FreeRTOS操作系统看

qq_30267617的博客 7万+

字节大牛带着他的 JDK 源码笔记来了(附完整目录开源)

JDK 源码 不知道大家闲下来的时候有没有去阅读过 JDK 源码,虽然看源码有点找虐的感觉,但作为一名程序员,在闲暇时看一下 jdk 源码,有利于对自己日常的开发环境了解得更加深刻。而且还有以下五点好处。 了解思想 熟悉设计模式 提高自己的代码优雅性 知晓原理,提升面试能力 提升自己代码的严谨性 虽然看源码有点找虐但被虐的同时是能学到很多东西的,真要能静下心来好好读一读源码的话好处远远不止这么多。而其中的 jdk 源码里面就有各种神奇且精巧的设计。如果你对

Java架构师之路的博客 500

基于CANoe的车载以太网测试

以太网测试 CANoe

Yafet 4553

6G网络的关键技术、应用前景与挑战并存的科技征途

移动通信技术正以前所未有的速度迭代更新,而6G技术的研发进程渐渐成为了当前科技领域的热点。全球各国已纷纷将目光投向了充满想象的6G时代。本文将探讨全球6G技术研发的最新进展,以及6G技术的核心创新与潜在应用。

fiberroad的博客 2424

c substring截取字符串_灵魂拷问:Java 的 substring() 是如何工作的?

在逛 programcreek 的时候,我发现了一些小而精悍的主题。比如说:Java 的 substring() 方法是如何工作的?像这类灵魂拷问的主题,非常值得深入地研究一下。另外,我想要告诉大家的是,研究的过程非常的有趣,就好像在迷宫里探宝一样,起初有些不知所措,但经过一番用心的摸索后,不但会找到宝藏,还会有一种茅塞顿开的感觉,非常棒。对于绝大多数的初级程序员或者说不重视“内功”的老鸟来说,往...

weixin_31758889的博客 264

usb设备的定位信息获取

一个usb hub有20个口,每个口有一个标号,那么如果一个为X的标号插入了一个android设备,如何通过函数,得到这个X,代码实现如下,获取了location, 得到类似 Port_#0002.Hub_#0003 的字符串,然后,要对应一个表。

babytiger的专栏 2106

灵魂拷问:Java 的 substring() 是如何工作的?

这是 Java 极客技术的第256篇原创文章在逛 programcreek 的时候,我发现了一些小而精悍的主题。比如说:Java 的 substring() 方法是如何工作的?像这类灵魂拷问的主题,非常值得深入地研究一下。另外,我想要告诉大家的是,研究的过程非常的有趣,就好像在迷宫里探宝一样,起初有些不知所措,但经过一番用心的摸索后,不但会找到宝藏,还会有一种茅塞顿开的感觉,非常棒。对于绝大多...

Java极客技术 893

用Python实现斗地主游戏(终端版)

马上就要过年了 大家也都放假了吧 过年必不可少的活动 打牌! 今天带大家来写一份斗地主 (又是好多天没怎么更新,忙成狗啊) 那么实现一个斗地主呢 我们肯定要先完善卡牌系统 from collections import Counter import numpy as np import itertools def cmp_to_key(mycmp): 'Convert a cmp= function into a key= function' class K: def _

Miku_wx的博客 9856

单反相机物镜设计[DG-10]

REAR(要打在像面,操作数要找像面对应位置15):以透镜单位表示的真实光线径向坐标,波长由Wave定义,参见“Hx、Hy、Px和Py”。最小玻璃厚度最小不能小于semi-dia的1/10,要根据layout看有没有过厚过薄,反复调节。PROD:两个操作数的乘积(操作#1 X操作#2)。3x4就是57.3x0.41=23.5。拦光一般在第一面和最后一面操作,减少边缘无用光线。光阑面与镜面贴近,要调距离,同时设置光阑像差。后截距是指从镜头后表面到焦点的距离。CONS:弧度转为角度。镜头相互嵌入,有错误。

weixin_72050316的博客 600

技术写作破局:从“没东西写”到持续输出的系统方法与实践

技术写作是开发者梳理知识、沉淀经验、建立影响力的重要途径。其核心原理在于通过结构化的输出,将零散的实践与思考系统化,实现知识的二次加工与深度内化。对于开发者而言,技术写作不仅能巩固自身技术栈,还能在社区中建立连接,其技术价值体现在知识传播、问题解决和职业成长等多个维度。在实际应用场景中,无论是记录日常开发中的**性能优化**实践,还是分享**微服务**架构下的设计思考,都是绝佳的写作素材。本文聚焦于解决开发者普遍面临的“选题枯竭”困境,通过剖析认知偏差,并提供一套从日常工作中挖掘选题、加工成文的可落地工作流

weixin_34099526的博客 330

传感器使用——ESP-WROOM-32 and INMP441麦克风音频采集

传感器使用——ESP-WROOM-32 and INMP441麦克风音频采集,数据显示及matlab操作界面。

qq_41958946的博客 7354

c++ string substring_灵魂拷问:Java 的 substring() 是如何工作的?

在逛 programcreek 的时候,我发现了一些小而精悍的主题。比如说:Java 的 substring() 方法是如何工作的?像这类灵魂拷问的主题,非常值得深入地研究一下。另外,我想要告诉大家的是,研究的过程非常的有趣,就好像在迷宫里探宝一样,起初有些不知所措,但经过一番用心的摸索后,不但会找到宝藏,还会有一种茅塞顿开的感觉,非常棒。对于绝大多数的初级程序员或者说不重视“内功”的老鸟来说,往...

weixin_39900180的博客 154

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

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

面经不是题库:程序员面试的正确备战方式

技术面试是程序员求职的关键环节,而面经常被误认为“题库”,实际却是他人面试经历的回忆录,存在主观性、片面性和时效性。本文从面经的三种类型出发,剖析其背后的原理,指出单纯刷题无法建立扎实的知识体系,容易在面试官的深度追问中暴露短板。真正高效的做法是以面经为线索,结合算法、系统设计、项目深挖等核心能力,构建考点体系图,并通过复盘与模拟演练将知识内化。文章提供了可落地的四周复习计划,帮助求职者在有限时间内从“背答案”转向“建体系”,全面提升技术面试的通过率,最终获得理想offer。

chubaisheng8627的博客 497

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Java反序化--CC5(javasec靶场中例题)

我手里有一个 “危险开关 LazyMap”,但没人按它;我先找一个跳板:调用它 toString 就能按下开关;最后再找一个自动装置:反序列化的时候自动调用 toString。三块标准零件,组合成全自动攻击链。这也是 Java 反序列化审计的核心思维:寻找隐式调用链,把零散的方法调用串联起来。

sjdixjxjxndj的博客 261

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

SDK集成实战:从环境配置到调试排错的开发者生存指南

软件开发工具包(SDK)是连接底层硬件、操作系统与上层应用的关键桥梁,它封装了核心库、API接口和工具链,为开发者提供了标准化的开发能力。理解SDK的层次结构(工具链、API、框架、文档)是高效使用的基础,其技术价值在于能极大降低开发门槛,确保兼容性与稳定性,是现代物联网、移动应用和嵌入式系统开发的基石。在实际工程实践中,环境配置、版本管理和依赖冲突是高频痛点,尤其体现在Android SDK、嵌入式SDK(如Nordic nRF系列)等具体场景中。掌握路径管理、镜像配置及构建系统集成等通用策略,能有效解决

weixin_30266885的博客 483

Godot引擎与Open RPG框架:快速构建回合制RPG的实战指南

游戏开发中,选择合适的引擎和框架是项目成功的关键。Godot作为一款开源、轻量级的游戏引擎,以其节点化场景管理和友好的脚本语言,为独立开发者提供了高效的工具链。结合专门为回合制角色扮演游戏设计的Open RPG框架,开发者可以快速搭建游戏的核心系统,如回合制战斗、角色属性和物品管理。这种组合极大地提升了从原型到成品的开发效率,让开发者能更专注于游戏内容和叙事设计。本文以Godot引擎和Open RPG框架为例,深入解析如何利用这一组合高效开发回合制RPG,涵盖从环境配置、核心模块定制到性能优化的全流程实践。

weixin_34218579的博客 302
上一篇: SpringCloudAlibaba全栈手册,让微服务架构更简单
下一篇: 【JAVA】让 ChatGPT 来浅说 AQS
Java技术那些事儿
博客等级 码龄5年 2306粉丝 2584原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值