#import "RootViewController.h"
@interface RootViewController ()
// 声明总票数
@property (nonatomic, assign) NSInteger totalTickets;
// 声明剩余票数
@property (nonatomic, assign) NSInteger subTickets;
// 线程锁
@property (nonatomic, retain) NSLock *lock;
@end
@implementation RootViewController
-(void)dealloc
{
[_lock release];
[super dealloc];
}
- (void)viewDidLoad {
[super viewDidLoad];
[self tickets];
}
#pragma mark ----------------买火车票线程锁实现-----------------------
// 买火车票线程锁实现
- (void)tickets
{
// 初始化票数
_totalTickets = 100;
// 剩余票
_subTickets = 100;
// 初始化线程锁
self.lock = [[NSLock alloc] init];
// 先创建出两个并行队列
// 一个队列是火车站
// 一个队列是12306
dispatch_queue_t queue1 = dispatch_queue_create("火车站", DISPATCH_QUEUE_CONCURRENT);
// 给火车站添加一个卖票的任务
dispatch_async(queue1, ^{
// 卖票
[self saleTickets:queue1];
});
// 创建12306队列
dispatch_queue_t queue2 = dispatch_queue_create("12306", DISPATCH_QUEUE_CONCURRENT);
// 也给12306添加一个卖票任务
dispatch_async(queue2, ^{
// 卖票
[self saleTickets:queue2];
});
}
// 卖票方法
- (void)saleTickets:(dispatch_queue_t)queue
{
// 循环卖票
while (_subTickets > 0) {
// 添加锁
// 线程锁和自动释放池 使用方法差不多 中间的部分是锁的内容
[self.lock lock];
// 要知道是哪个队列来卖票
// 通过队列的标示符 得到
//dispatch_queue_get_label(queue)得到队列的标示符
char *name = (char *)dispatch_queue_get_label(queue);
NSString *str = [NSString stringWithUTF8String:name];
NSLog(@"%@还剩%ld", str, _subTickets);
//来一回减少一张
_subTickets--;
//解锁
[self.lock unlock];
}
}
@end
相关推荐
习题6-3 使用函数输出指定范围内的完数
其中函数factorsum须返回int number的因子和;函数PrintPN要逐行输出给定范围[mn]内每个完数的因子累加形式的分解式,每个完数占一行,格式为“完数 = 因子1 + 因子2 + ... + 因子k”,其中完数和因子均按递增顺序给出。如果给定区间内没有完数,则输出一行“No perfect number”。
android——线程池(单例)、线程1等待线程2执行完才往下走、线程锁(synchronized关键字和ReentrantLock)
所以在我们使用线程池的时候,需要把线程池做成单例(有的同学会想着new一个线程池放到全局来使用,其实正确的做法是做成单例最好),创建的时候定义好多少个线程。如果把new ThreadPoolExecutor放进循环,会造成内存溢出。
Linux系统搭建OpenClaw(原Clawdbot)全流程指南 最新版
工具定位:开源个人 AI 助手,支持文件读取、命令执行、多渠道交互(Telegram / 本地终端等);系统要求:主流 Linux 发行版(Ubuntu/Debian/CentOS 等),Node.js ≥22(核心依赖);安全提示:OpenClaw 为测试版,具备高权限操作能力,建议使用非主力机,配置权限白名单,避免接触敏感数据。
android 线程锁Lock
今天,简单讲讲android的线程锁 Lock的使用。 这个其实和SynchronizedClass 是一样的。我记得我的一篇博客写过这个内容。再次记录一下。 一、同步机制关键字synchronized 对于java来说,最常用的同步机制就是synchronized关键字,他是一种基于语言的粗略锁,能够作用于对象、函数、class。每个对象都只有一个锁,谁能够拿到这个锁谁
巨量千川M-API实战:5分钟搞定短视频计划数据自动获取(Python版)
本文详细介绍了如何利用巨量千川M-API和Python快速搭建自动化工具,实现短视频计划数据的自动获取。通过实战代码演示了从环境准备、Token管理到核心数据接口调用的完整流程,帮助电商运营和技术开发者告别手动导出,高效完成数据汇总与分析。
FreeCAD源码分析:Sketcher模块
Sketcher模块基于Part模块功能实现了特征编辑(Feature Editing)建模的功能。这类参数化建模系统主要包括几何表示、约束求解器等两大组成部分。
Android 线程及线程安全(二)之Synchronized vs Lock
Android 线程及线程安全(二)之Synchronized vs Lock 一、Synchronized synchronized用于修饰方法、静态方法和代码块。 1、修饰代码块
手机安装Kali Linux
在数字化时代,信息安全和隐私保护显得尤为重要。,作为一款专业的和工具,因其强大的功能和丰富的资源库而受到广大安全研究者和爱好者的青睐。然而,我们通常只能在传统的电脑设备上安装和使用Kali Linux。那么,有没有可能将也变成一款随身携带的Kali Linux设备呢?答案是肯定的。本文将介绍如何在手机上安装Kali Linux,使你的手机变成一款强大的移动安全工具。,我们需要明确一点,手机安装Kali Linux并非简单的操作,需要对手机进行一定的改造和配置。
Android知识归纳--多线程中的锁 20240929
在大多数实际的多线程应用中,经常会出现。如果两个线程同时存取相同的对象,并且每一个线程都调用了一个修改该对象状态的方法,那么将会发生对数据的错误操作。为了防止这个现象,必须学习如何同步存取数据。举个例子:张三去银行操作自己的账户,每次存100进去,然后再取100出来,按理说余额应该是不变的。但是,如果开了多个线程,每个线程的run方法里都是先将余额加100,然后再将余额减100,那么最终你会发现,在统计余额的时候,每次都不一样,这就是线程共享数据带来的问题。
YOLOv8【第十一章:视频追踪与流处理篇·第6节】BoT-SORT 改进:结合相机运动补偿(CMC)提升追踪稳定性!
🏆 本文收录于 《YOLOv8实战:从入门到深度优化》 专栏。该专栏系统复现并梳理全网各类 YOLOv8 改进与实战案例(当前已覆盖分类 / 检测 / 分割 / 追踪 / 关键点 / OBB 检测等方向),坚持持续更新 + 深度解析,质量分长期稳定在 97 分以上,可视为当前市面上 覆盖较全、更新较快、实战导向极强 的 YOLO 改进系列内容之一。
【100%通过率】2023华为od机试C卷【电脑病毒感染】C++ 实现
一个局域网内有很多台电脑,分别标注为 0 ~ N-1 的数字。相连接的电脑距离不一样,所以感染时间不一样,感染时间用t 表示。其中网络内一台电脑被病毒感染,求其感染网络内所有的电脑最少需要多长时间。如果最后有电脑不会感染,则返回-1.
Android 线程安全+volatile
1.数据依赖性 如果两个操作访问同一个变量,且这两个操作中有一个为写操作,此时这两个操作之间就存在数据依赖。 数据依赖分下列三种类型: ①写后读(a = 1;b = a;) 写一个变量之后,再读这个位置。 ②写后写 (a = 1;a = 2;) 写一个变量之后,再写这个变量。 ③读后写(a = b;b = 1;) 读一个变量之后,再写这个变量。 上面三种情况,只要重排序两个操作的执行顺序,程序的执行结果将会被改变。所以,编译器和处理器在重排序时,会遵守数据依赖性,编译器和处理器不会改变存在数据依赖关系的两个
UDF学习(四)FLUENT UDF-DEFINE_PROFILE宏
利用DEFINE_PROFLILE可以指定以下边界或计算域信息:DEFINE_PROFILE(name,t,i)//既可以用。
iOS多线程之线程锁
在多线程开发中,不可忽视的一个问题就是多个线程同时访问同一个资源时,会造成脏数据等预想不到的结果,为了避免这种现象,我们需要在访问资源的时候添加线程锁,来控制访问。 添加线程锁的方式在这主要讲三种方式: @synchronized隐式创建锁对象 NSLock GCD的dispatch_semaphore_t信号机制 一、@synchronized( ) @synchronized()内的对象设...
IDEA的使用指南
IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.
TMS_WebGMaps_1.9.8.0_Full_Source
TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder
【iOS】从实际出发理解多线程(二)--NSThread高级操作
上篇文章讲了一下NSThread的基本操作,本篇讲一下NSThread的一些高级用法。 线程间资源共享&线程加锁 在程序运行过程中,如果存在多线程,呢么各个线程读写资源就会存在先后、同时读写资源的操作,因为实在不同线程中,CPU调度过程中我们无法保证哪个线程会先读写资源,哪个线程后读写资源。这就有可能操作数据混乱和错误。因此为了防止数据读写混乱和错误的发生,我们要将线程在读写数据时加锁...
大中型超市收银系统(可直接运行)
光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开
一起Talk Android吧(第三百六十六回:多线程之LOCK锁)
本章回中主要介绍LOCK锁的使用方法,并且通过示例程序来演示如何使用LOCK锁解决多线程访问共享资源的问题。最后对比总结了LOCK锁与其它线程同步方法之间的优缺点。
深度学习工具包 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');```[](https://bitdeli.com/free "Bitdeli Badge")
Android 多线程——线程安全/线程同步
单一程序中每次只能做一件事情,它是串行执行的;但多线程程序是可以异步并发处理同一件事情,这样就会发生两个线程抢占资源的问题,使如一个线程正在写数据,而另一个线程刚才在读数据,那么就会产生很多未知的错误情况出现,这也是多线程最危险的事情。
Android多线程研究(9)——线程锁Lock
在前面我们在解决线程同步问题的时候使用了synchronized关键字,今天我们来看看Java 5.0以后提供的线程锁Lock. >>>>>>>>>>>>盗QQ号详细教程 Lock接口的实现类提供了比使用synchronized关键字更加灵活和广泛的锁定对象操作,而且是以面向对象的方式进行对象加锁。 1
Android 线程死锁场景与优化
本文主要是对死锁的问题的优化建议,至于性能问题,其实我们遵循一个原则:在保证流畅度的情况下线程越少越好。对于必要存在的线程,可以使用队列缓冲、逃逸分析、对象标量化、锁消除、锁粗化、降低锁范围、多路复用、消除同步屏障、协程的角度去优化。如果想要成为架构师或想突破20~30K薪资范畴,那就不要局限在编码,业务,要会选型、扩展,提升编程思维。此外,良好的职业规划也很重要,学习的习惯很重要,但是最重要的还是要能持之以恒,任何不能坚持落实的计划都是空谈。
2024年安卓最全线程死锁分析思路(1),2024年最新看我如何一步一步攻克面试官的英文
【Android开发核心知识点笔记】【Android思维脑图(技能树)】【Android核心高级技术PDF文档,BAT大厂面试真题解析】【Android高级架构视频学习资源】网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。需要这份系统化学习资料的朋友,可以戳这里获取一个人可以走的很快,但一群人才能走的更远!
android多线程lock,Android多线程研究(9)——线程锁Lock
在前面我们在解决线程同步问题的时候使用了synchronized关键字,今天我们来看看Java 5.0以后提供的线程锁Lock.Lock接口的实现类提供了比使用synchronized关键字更加灵活和广泛的锁定对象操作,而且是以面向对象的方式进行对象加锁。@Overridepublic void run() {while(true){Lock lock = new ReentrantLock();...
Android多线程-----同步锁
一、同步机制关键字synchronized 对于java来说,最常用的同步机制就是synchronized关键字,他是一种基于语言的粗略锁,能够作用于对象、函数、class。每个对象都只有一个锁,谁能够拿到这个锁谁就有访问权限。当synchronized作用于函数时,实际上锁的也是对象,锁定的对象就是该函数所在类的对象。而synchronized作用于class时则是锁的这个Clas
iOS开发—线程之间资源共享(以卖火车票为例)—同步锁的使用
进程中的一块资源可能会被多个线程共享,也就是多个线程kennel会访问同一块资源,这里的资源包括对象、变量、文件等。当多个线程同时访问同一块资源时,会造成资源抢夺,很容易引发数据错乱和数据安全问题。 为了更好的理解线程安全的问题,引入一个卖票的案例,同时设置3个窗口卖票,模拟为每一个窗口开启一个线程,共同访问票数资源。新建一个Single View Application应用,名称为02-Thr
iOS线程锁NSLock案例(卖火车票)
#import "RootViewController.h" @interface RootViewController () // 声明总票数 @property (nonatomic, assign) NSInteger totalTickets; // 声明剩余票数 @property (nonatomic, assign) NSInteger
iOS 常用各种锁来模拟卖票功能
很多人遇到过类似这样的业务场景, 例如一共有50张车票要卖,当只有一个售票点时一张一张卖没有问题,但是当有多个售票点时,每次售票需要查询是否还有票,也就是说售票出票这个动作同一时间只能一个地方完成。 于是列举iOS一些常见的锁来实现此功能。1.@synchronized 互斥锁,@synchronized(self)里面的self是锁的标识,一样标识方可互斥@synchronized块会隐式的...
863



被折叠的 条评论
为什么被折叠?



