java synchronized 的实现机制

获取上传至DMS服务器上文件的URL 如果需要失效时间延长会设置URL永久有效, 可以去修改函数SCMS_URL_GENERATE的参数DURATION 或EXPIRATION ,DURATION最大时间是999999,若需要永久有效,则需要设置EXPIRATION的时间,这时系统会忽略DURATION的参数,生成URL的时候 SCMS_URL_GENERATE会调用SCMS_URL_SIGN函数这是其中默认这是了URL的生效时间为两小时。 阅读详情

最近在做项目的时候遇到了较多的同步问题 。

JAVA 给我们提供了很方便的方法去解决多线程同步的问题   synchronized 关键字  

一直很疑惑  synchronized 是怎么来做同步的呢   实现 原理是什么呢     ?


1 synchronized -- 对象加锁

 所有对象都自动含有单一的锁,JVM负责跟踪对象被加锁的次数。

如果一个对象被解锁,其计数变为0。

在任务(线程)第一次给对象加锁的时候, 计数变为1。

每当这个相同的任务(线程)在此对象上获得锁时,计数会递增。

 只有首先获得锁的任务(线程)才能继续获取该对象上的多个锁。

每当任务离开时,计数递减,当计数为0的时候,锁被完全释放。

synchronized就是基于这个原理,同时synchronized靠某个对象的单一锁技术的次数来判断是否被锁,所以无需(也不能)人工干预锁的获取和释放。

 原理!!!!!!!!!! 如果结合方法调用时的栈和框架(如果对方法的调用过程不熟悉建议看看http://wupuyuan.iteye.com/blog/1157548),

 不难推测出synchronized原理是基于栈中的某对象来控制一个框架,

所以对于synchronized有常用的优化是锁对象不锁方法。

实际上 synchronized作用于方法时,锁住的是“this”,

作用于静态方法/属性时,锁住的是存在于永久带的CLASS,相当于这个CLASS的全局 锁,锁作用于一般对象时,锁住的是对应代码块。

在HotSpot中JVM实现中,锁有个专门的名字:对象监视器。   

 当多个线程同时请求某个对象监视器时,对象监视器会设置几种状态用来区分请求的线程 Contention List:所有请求锁的线程将被首先放置到该竞争队列,是个虚拟队列,不是实际的Queue的数据结构。  Entry List:EntryList与ContentionList逻辑上同属等待队列,ContentionList会被线程并发访问,为了降低对 ContentionList队尾的争用,而建立EntryList。,Contention List中那些有资格成为候选人的线程被移到Entry List  Wait Set:那些调用wait方法被阻塞的线程被放置到Wait Set  OnDeck:任何时刻最多只能有一个线程正在竞争锁,该线程称为OnDeck  

高通SDX12:ProSLIC Si32185移植调试 高通 SDX12 语音芯片slic 音频驱动 Si32185 阅读详情

相关推荐

Win10家庭版中文用户名改英文全攻略:从注册表到环境变量一步不落

本文详细介绍了Windows 10家庭版中文用户名改为英文的完整流程,包括注册表编辑、环境变量调整等关键步骤。通过激活管理员账户、重命名用户文件夹、修改注册表键值等操作,彻底解决因中文路径导致的软件兼容性问题,并提供常见错误解决方案和系统维护建议。

weixin_29227425的博客 427

synchronized底层实现及优化机制

synchronized底层实现及优化机制 前言 首先介绍下synchronized锁,它属于互斥锁、悲观锁、同步锁、“重量级锁“”。它在1.6之前和1.6后加锁机制是不一样的。jdk1.6之前我简单说下流程,重点说下jdk1.6之后优化机制。 jdk1.6之前 可以看到synchronized加锁加的是内部的monitor对象,monitor是操作系统内部的对象,当多个线程一起访问synchronized修饰的代码块时,如果线程1先执行加锁的操作,然后执行业务方法,其他线程就会加不成功,然后阻塞在一个队

随影无痕的博客 302

暗黑破坏神2重制版 mod制作教程(一)

暗黑2重制版mod修改教程

hhhh2312的博客 7449

Lab6——synchronize的实现机制

在lab6中,我们需要使用java的同步机制,主要是synchronized方法和synchronized代码块。为了更好地理解这里的原理,我查询了一些关于synchronized的实现机制。 在Java中,对象被创建在堆中,其中的结构不止包含对象的数据,还包括对象头和对齐。 其中对象头中就存储着关于对象锁的信息,存储着一个指向“锁”的指针。这个指针指向一个monitor对象,Java中,每个对...

qq_43351085的博客 275

Claude Code长期记忆:优雅的上下文管理

ClaudeCode的上下文管理系统采用三层架构设计,通过智能压缩和优化策略在记忆容量与性能间取得平衡。系统包含短期记忆(高速工作区)、中期记忆(智能蒸馏器)和长期记忆(持久化知识库)。当Token使用率达到92%阈值时启动wU2压缩器,采用8段式结构化摘要保留关键信息,并配合智能文件恢复和渐进式预警机制。该系统通过分层处理、优雅降级和透明化交互,为AI应用提供了高效可靠的上下文管理方案,展现了在有限资源下实现智能记忆的艺术。

m0_53117338的博客 3814

摄像机实时接入分析平台视频分析网关AI智能分析智慧营业厅方案

通过智能化的改造,可以提高营业厅的运营效率,降低运营成本,同时提升客户体验和安全保障。

EasyDarwin开源社区技术博客 703

synchronized实现原理与应用

目录: 什么是线程安全&线程不安全 什么是线程安全&线程不安全 线程不安全就是不提供数据访问保护,有可能出现多个线程先后更改数据造成所得到的数据就是脏数据。 线程安全 就是多线程访问时,采用加锁机制,当一个线程访问该类某个数据时,进行保护,其他线程不能进行访问直到该线程读取完毕,其他线程才能使用。不会出现数据不一致或者数据污染。 ...

qq_41458645的博客 436

Quartus Prime 软件 USB-blaster 驱动安装失败【已解决】

一、安装步骤 1、将FPGA 开发板插入电脑时,未安装驱动的电脑会提示安装usb-Blaster驱动。Windows搜索框打开设备管理器,在“其他设备”下会发现黄色感叹号的“USB-Blaster”的设备驱动。 2、Quartus系列软件的安装目录下自带USB-blaster的驱动程序,右键更新驱动,选择驱动目录:(D:\intelFPGA\18.1\quartus\drivers\usb-blaster,文件位置和版本请按照自己安装的路径选择),点击Next开始安装。 3、安装成功,重启电脑即可使

adolphwang_909086的博客 6万+

Synchronized实现原理和锁优化

Synchronized的三种用法 synchronized可以保证方法或者代码块在运行时,同一时刻只有一个方法可以进入到临界区,同时它还可以保证共享变量的内存可见性 Java中每一个对象都可以作为锁,这是synchronized实现同步的基础。 synchronized 常见的三种用法如下: 普通同步方法,锁是当前实例对象 静态同步方法,锁是当前类的class对象 同步方法...

lzf的博客 4016

数字后端:版图基础seal ring

seal ring结构是为了防止划片或封装对芯片造成破坏,从而在芯片与划片道(scribe line)之间添加的一圈保护环

m0_61544122的博客 1万+

Linux 服务器上部署 OpenClaw完整教程

2. 全局安装 OpenClaw 3. 初始化配置 配置模型提供商 方式一:使用配置命令(推荐) 方式二:直接编辑配置文件 在 部分添加: 配置多个模型提供商 如果你使用 Antigravity 本地代理,可以同时配置多个模型: 配置飞书集成 1. 创建飞书应用 访问 飞书开放平台 创建企业自建应用 记录 App ID 和 App Secret 2. 配置应用权限 在飞书开放平台,为应用添加以下权限:重要: 必须使用 长连接(WebSocket) 模式,不要使用 HTTP 回调!在飞书开放

Maynor的博客 5247

深入解析 Java 中 synchronized 的实现原理与机制

的底层实现融合了对象头 Mark WordMonitor 机制CAS 操作和锁升级策略,是 JVM 层面的核心同步机制。理解其原理需要结合 JVM 源码和操作系统知识,在实际开发中需根据场景选择合适的锁粒度和类型。

weixin_43718423的博客 998

请尽可能地详细说明一个VLA项目的立项训练到落地的全流程

一个机器人VLA项目的全流程是一个复杂的系统工程,它深度融合了机器人学 (Robotics)计算机视觉 (CV)和自然语言处理 (NLP)。其核心挑战在于高质量数据的获取和从仿真到现实的有效迁移。与纯粹的软件AI项目相比,它增加了硬件、物理交互和安全性的维度,但其最终能让AI走出虚拟世界、在物理世界中产生实际价值,这也是其巨大的魅力所在。

具身机器人和通用AI 303

JAVA 并发机制的底层实现原理之synchronized

synchronized 在多线程并发中一直是元老级角色,在java SE 1.6 中为了减少获取锁和释放锁引入了偏向锁、轻量级锁、以及重量级锁。 synchronized 实现同步基础 ...

太#阳%鸟的博客 170

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

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

java synchronized 的实现机制

[size=large]最近在做项目的时候遇到了较多的同步问题 。 JAVA 给我们提供了很方便的方法去解决多线程同步的问题 synchronized 关键字 一直很疑惑 synchronized 是怎么来做同步的呢 实现 原理是什么呢 ? 1 synchronized -- 对象加锁 所有对象都自动含有单一的锁,JVM负责跟踪对象被加锁的次数。 如果...

233

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Java并发机制的底层实现原理 - synchronized和volatile

“本文主要介绍synchronized和volatile到实现原理” synchronized和volatile几乎是java面试基础部分必会,不会你就吃亏了,这一篇文章摘抄《Java并发编程的艺术》 对于初学者来说看懂这篇可能有点困难,应该先弄明白synchronized和volatile后再看原理,看不会就多看几遍,免得出了BAT的办公大楼后后悔哦。 Jav...

551

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Java并发机制的底层实现原理 - synchronized和volatile

“本文主要介绍synchronized和volatile到实现原理”synchronized和volatile几乎是java面试基础部分必会,不会你就吃亏了,...

200

java synchronized 机制_java面试-synchronized底层实现机制

一、synchronized的三种应用方式1、修饰实例方法,锁是当前实例对象,进入同步代码前要获得当前实例的锁/*** synchronized修饰实例方法,当前线程的锁是实例对象accountingSync* 当一个线程正在访问一个对象的synchronized实例方法,那么其他线程不能访问该对象的其他synchronized方法* 一个对象只有一把锁*/public class Account...

weixin_33993891的博客 133

java锁机制 jvm如何实现_深入JVM锁机制1-synchronized

数据同步需要依赖锁,那锁的同步又依赖谁?synchronized给出的答案是在软件层面依赖JVM,而Lock给出的方案是在硬件层面依赖特殊的CPU指令,大家可能会进一步追问:JVM底层又是如何实现synchronized的?本文所指说的JVM是指Hotspot的6u23版本,下面首先介绍synchronized的实现:synrhronized关键字简洁、清晰、语义明确,因此即使有了Lock接口,使...

weixin_39528843的博客 122

Java 中 synchronized 的底层实现和锁的升降级机制是什么?

本文深入解析了Java中synchronized的底层实现机制,重点介绍了锁的升级过程及其优化原理。文章首先从对象头的Mark Word结构入手,详细说明了无锁、偏向锁、轻量级锁和重量级锁的不同状态标记。随后通过流程图展示了锁从偏向锁到重量级锁的升级路径,分析了每种锁的适用场景、实现原理和性能特点。特别指出锁升级的核心目标是减少直接使用重量级锁的开销,并强调了重量级锁不可降级的设计选择。最后通过JOL工具演示了如何验证锁状态变化,并总结了锁消除、锁粗化等JVM优化策略。全文系统性地揭示了synchroniz

m0_63331248的博客 709

Java并发机制的底层实现原理--synchronized

Java并发机制的底层实现原理–synchronized synchronized的应用 关键词:重量级锁,偏向锁,轻量级锁,java对象头 问题:什么是“锁”? 1.锁。java中每一个对象都可以作为锁。 1.1,普通同步方法,锁是当前实例对象 1.2,静态同步方法,锁是当前class对象 1.3,同步方法块,锁是Synchronized括号里配置的对象 问题:“锁”有什么作用?...

qq_38839744的博客 190

简析synchronized原理与Java对象中的等待通知机制实现原理

什么是并发编程中的等待通知机制?简而言之就是一个线程修改了一个对象的值,而另一个线程感知到了变化,然后进行相应的操作。在前面的博客Java JUC 并发包组件之LockSupport与Condition的使用中,我们介绍了使用队列同步器实现的等待通知机制,本篇我们介绍使用synchronized实现的Java对象的等待通知机制,等待/通知的相关方法是任意Java对象都具备的,因为这些方法被定义在所有对象的超类 java.lang.Object上,方法和描述如下表所示: 方法名

微服务技术栈 621

第二章 Java并发机制的底层实现原理 Synchronized 思维导图

Rush6666的博客 237

Java并发机制底层实现-synchronized

文章目录synchronized一、synchronized的基础二、实现原理1.代码块同步2.方法同步3.指令细节 synchronized 一、synchronized的基础 Java中的每个对象都有内部锁,都可以作为一个锁; 普通同步方法,锁是当前实例对象 静态同步方法,锁是当前类的class对象 同步方法块,锁是Synchronized括号中配置的对象 二、实现原理 JVM基于进入和退出Monitor对象来实现方法同步和代码块同步; 这个Monitor翻译为监视器,但是可以理解为一个每次只允

weixin_43509320的博客 630

Synchronized的实现原理:深入理解Java线程同步机制

synchronized 是Java中实现线程同步的重要机制,其底层实现涉及对象头、Monitor、锁升级等多个复杂概念。了解这些原理不仅有助于我们使用 synchronized ,还能在性能调优时做出更合理的选择。随着Java版本的更新,synchronized 的性能已经得到了大幅提升,在大多数场景下都能提供良好的性能表现。但在高并发场景下,我们仍能需要根据具体情况选择合适的同步策略。

优快云_xysf的博客 928

synchronized 与 ReentrantLock:Java 锁机制原理与实现对比

本文从字节码层面拆解 synchronized 的 monitorenter/monitorexit 指令和 HotSpot 的轻量级锁/重量级锁优化机制,再从 AQS 的 state + CLH 队列结构解析 ReentrantLock 的公平/非公平锁实现,最后通过对比表格和实战代码给出选型决策:需要超时、中断或多条件变量就用 ReentrantLock,其他场景synchronized 就够了。

weixin_68431870的博客 395
上一篇: android debug 任意程序
下一篇: java 调试
chenghai2011
博客等级 码龄15年 22粉丝 41原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值