object-c中的锁-@synchronized

iOS 多线程同步策略之-----锁NSLock和@synchronized 1.NSLock---锁同步 - (void)viewDidLoad { [super viewDidLoad]; NSLock * lock = [[NSLock alloc]init]; dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ [lock 阅读详情
锁是线程编程同步工具的基础。锁可以让你很容易保护代码中一大块区域以便你可以确保代码的正确性。
1 使用POSIX互斥锁
    POSIX互斥锁在很多程序里面很容易使用。为了新建一个互斥锁,你声明并初始化一个pthread_mutex_t的结构。为了锁住和解锁一个互斥锁,你可以使用pthread_mutex_lock和pthread_mutex_unlock函数。列表4-2显式了要初始化并使用一个POSIX线程的互斥锁的基础代码。当你用完一个锁之后,只要简单的调用pthread_mutex_destroy来释放该锁的数据结构。 
    Listing 4-2 
    Using a mutex lock pthread_mutex_t mutex; 
    void MyInitFunction() 
    { 
        pthread_mutex_init(&mutex, NULL); 
    } 
    void MyLockingFunction() 
    { 
        pthread_mutex_lock(&mutex); 
        // Do work. pthread_mutex_unlock(&mutex); 
    }
    注意:上面的代码只是简单的显式了使用一个POSIX线程互斥锁的步骤。你自己的代码应该检查这些函数返回的错误码,并适当的处理它们。
4.6.2 使用NSLock类
    在Cocoa程序中NSLock中实现了一个简单的互斥锁。所有锁(包括NSLock)的接口实际上都是通过NSLocking协议定义的,它定义了lock和unlock方法。你使用这些方法来获取和释放该锁。
    除了标准的锁行为,NSLock类还增加了tryLock和lockBeforeDate:方法。方法tryLock试图获取一个锁,但是如果锁不可用的时候,它不会阻塞线程。相反,它只是返回NO。而lockBeforeDate:方法试图获取一个锁,但是如果锁没有在规定的时间内被获得,它会让线程从阻塞状态变为非阻塞状态(或者返回NO)。
    下面的例子显式了你可以是NSLock对象来协助更新一个可视化显式,它的数据结构被多个线程计算。如果线程没有立即获的锁,它只是简单的继续计算直到它可以获得锁再更新显式。 
    BOOL moreToDo = YES; 
    NSLock *theLock = [[NSLock alloc] init]; 
    ... 
    while (moreToDo) { 
         
         
        if ([theLock tryLock]) { 
             
            [theLock unlock]; 
        } 
    }
4.6.3 使用@synchronized指令
    @synchronized指令是在Objective-C代码中创建一个互斥锁非常方便的方法。@synchronized指令做和其他互斥锁一样的工作(它防止不同的线程在同一时间获取同一个锁)。然而在这种情况下,你不需要直接创建一个互斥锁或锁对象。相反,你只需要简单的使用Objective-C对象作为锁的令牌,如下面例子所示: 
    - (void)myMethod:(id)anObj 
    { 
        @synchronized(anObj) 
        { 
            // Everything between the braces is protected by the @synchronized directive. 
        } 
    }
    创建给@synchronized指令的对象是一个用来区别保护块的唯一标示符。如果你在两个不同的线程里面执行上述方法,每次在一个线程传递了一个不同的对象给anObj参数,那么每次都将会拥有它的锁,并持续处理,中间不被其他线程阻塞。然而,如果你传递的是同一个对象,那么多个线程中的一个线程会首先获得该锁,而其
他线程将会被阻塞直到第一个线程完成它的临界区。
    作为一种预防措施,@synchronized块隐式的添加一个异常处理例程来保护代码。该处理例程会在异常抛出的时候自动的释放互斥锁。这意味着为了使用@synchronized指令,你必须在你的代码中启用异常处理。了如果你不想让隐式的异常处理例程带来额外的开销,你应该考虑使用锁的类。
4.6.4 使用其他Cocoa锁
    以下个部分描述了使用Cocoa其他类型的锁。
·使用NSRecursiveLock对象
    NSRecursiveLock类定义的锁可以在同一线程多次获得,而不会造成死锁。一个递归锁会跟踪它被多少次成功获得了。每次成功的获得该锁都必须平衡调用锁住和解锁的操作。只有所有的锁住和解锁操作都平衡的时候,锁才真正被释放给其他线程获得。
    正如它名字所言,这种类型的锁通常被用在一个递归函数里面来防止递归造成阻塞线程。你可以类似的在非递归的情况下使用他来调用函数,这些函数的语义要求它们使用锁。以下是一个简单递归函数,它在递归中获取锁。如果你不在该代码里使用NSRecursiveLock对象,当函数被再次调用的时候线程将会出现死锁。               NSRecursiveLock *theLock = [[NSRecursiveLock alloc] init]; 
    void MyRecursiveFunction(int value) { 
        [theLock lock]; 
        if (value != 0) { 
            --value; 
            MyRecursiveFunction(value); 
        }
        [theLock unlock]; 
    } 
    MyRecursiveFunction(5);
    注意:因为一个递归锁不会被释放直到所有锁的调用平衡使用了解锁操作,所以你必须仔细权衡是否决定使用锁对性能的潜在影响。长时间持有一个锁将会导致其他线程阻塞直到递归完成。如果你可以重写你的代码来消除递归或消除使用一个递归锁,你可能会获得更好的性能。
·使用NSConditionLock对象
    NSConditionLock对象定义了一个互斥锁,可以使用特定值来锁住和解锁。不要把该类型的锁和条件(参见“条件”部分)混淆了。它的行为和条件有点类似,但是它们的实现非常不同。
    通常,当多线程需要以特定的顺序来执行任务的时候,你可以使用一个NSConditionLock对象,比如当一个线程生产数据,而另外一个线程消费数据。生产者执行时,消费者使用由你程序指定的条件来获取锁(条件本身是一个你定义的整形值)。当生产者完成时,它会解锁该锁并设置锁的条件为合适的整形值来唤醒消费者线程,之后消费线程继续处理数据。
    NSConditionLock的锁住和解锁方法可以任意组合使用。比如,你可以使用unlockWithCondition:和lock消息,或使用lockWhenCondition:和unlock消息。当然,后面的组合可以解锁一个锁但是可能没有释放任何等待某特定条件值的线程。
    下面的例子显示了生产者-消费者问题如何使用条件锁来处理。想象一个应用程序包含一个数据的队列。一个生产者线程把数据添加到队列,而消费者线程从队列中取出数据。生产者不需要等待特定的条件,但是它必须等待锁可用以便它可以安全的把数据添加到队列。 
    id condLock = [[NSConditionLock alloc] initWithCondition:NO_DATA]; 
    while(true) { 
        [condLock lock]; 
        
        [condLock unlockWithCondition:HAS_DATA]; 
    }
    因为初始化条件锁的值为NO_DATA,生产者线程在初始化的时候可以毫无问题的获取该锁。它会添加队列数据,并把条件设置为HAS_DATA。在随后的迭代中,生产者线程可以把到达的数据添加到队列,无论队列是否为空或依然有数据。唯一让它进入阻塞的情况是当一个消费者线程充队列取出数据的时候。
    因为消费者线程必须要有数据来处理,它会使用一个特定的条件来等待队列。当生产者把数据放入队列时,消费者线程被唤醒并获取它的锁。它可以从队列中取出数据,并更新队列的状态。下列代码显示了消费者线程处理循环的基本结构。 
    while (true) { 
        [condLock lockWhenCondition:HAS_DATA]; 
         
        [condLock unlockWithCondition:(isEmpty ? NO_DATA : HAS_DATA)]; 
        // Process the data locally. 
    }
·使用NSDistributedLock对象
    NSDistributedLock类可以被多台主机上的多个应用程序使用来限制对某些共享资源的访问,比如一个文件。锁本身是一个高效的互斥锁,它使用文件系统项目来实现,比如一个文件或目录。对于一个可用的NSDistributedLock对象,锁必须由所有使用它的程序写入。这通常意味着把它放在文件系统,该文件系统可以被所有运行在计算机上面的应用程序访问。
    不像其他类型的锁,NSDistributedLock并没有实现NSLocking协议,所有它没有lock方法。一个lock方法将会阻塞线程的执行,并要求系统以预定的速度轮询锁。以其在你的代码中实现这种约束,NSDistributedLock提供了一个tryLock方法,并让你决定是否轮询。
    因为它使用文件系统来实现,一个NSDistributedLock对象不会被释放除非它的拥有者显式的释放它。如果你的程序在用户一个分布锁的时候崩溃了,其他客户端无法访问该受保护的资源。在这种情况下,你可以使用breadLock方法来打破现存的锁以便你可以获取它。但是通常应该避免打破锁,除非你确定拥有进程已经死亡并不可能再释放该锁。
    和其他类型的锁一样,当你使用NSDistributedLock对象时,你可以通过调用unlock方法来释放它。
电池管理系统(BMS)软件:CATL BMS二次开发_(1).CATL BMS软件概述 CATL BMS软件的保护机制是确保电池组安全和可靠运行的关键部分。通过高精度的传感器和智能算法,BMS可以实时监测电池组的状态,及时采取保护措施。二次开发中,可以根据特定的应用需求,增加新的传感器、优化算法、扩展通信接口等,进一步提高系统的性能和可靠性。维护和扩展则是确保系统长期稳定运行的重要手段。希望以上内容对您理解CATL BMS软件的保护机制有所帮助。如果您有任何进一步的问题或需要更详细的解释,欢迎随时提问。 阅读详情

相关推荐

实战派指南:反激电源EMI滤波器设计,从理论计算到PCB布局避坑

本文详细解析了反激式开关电源EMI滤波器设计的全流程,从理论计算到PCB布局避坑,结合34W PD快充电源案例,系统介绍了共模与差模干扰的识别、关键元件选型、参数计算优化及PCB布局技巧,帮助工程师有效解决传导测试超标等常见问题。

weixin_29230805的博客 373

Objective-C中的锁

锁是线程编程同步工具的基础。锁可以让你很容易保护代码中一大块区域以便你可以确保代码的正确性。 1 使用POSIX互斥锁     POSIX互斥锁在很多程序里面很容易使用。为了新建一个互斥锁,你声明并初始化pthread_mutex_init一个pthread_mutex_t的结构。为了锁住和解锁一个互斥锁,你可以使用pthread_mutex_lock和pthread_mutex_unlo

把握自己。 3319

CS224W图神经网络实战:如何用Motifs和Graphlets分析社交网络结构?

本文基于斯坦福CS224W课程,深入探讨了如何利用网络模体(Motifs)和图元(Graphlets)分析社交网络的微观结构。通过实战代码演示,文章介绍了如何识别具有统计显著性的关键连接模式,计算节点的图元度向量以刻画局部拓扑特征,并将这些结构洞见应用于社区发现、影响力分析及图神经网络的节点特征工程,从而提升模型在虚假账号检测等任务中的性能。

2w3e4r5t6y的博客 911

@synchronized

http://www.cocoachina.com/bbs/read.php?tid-26112-keyword-self.html 作用:保证此时没有其他线程对self对象进行修改 Using the @synchronized Directive The @

yohohohoho的专栏 1928

手把手教你用STM32F103C8T6驱动CLRC663国产NFC模块(兼容A/B/F/15693卡)

本文详细介绍了如何使用STM32F103C8T6驱动国产CLRC663 NFC模块,支持ISO14443A/B、Felica和ISO15693协议。从硬件设计、协议适配到状态监控,提供完整的工程实现方案,适用于智能门锁、支付终端等应用场景。

weixin_30689307的博客 445

国赛数学建模高教社杯历届优秀论文全集

包含了2004到2023年高教社的赛题及优秀论文。

BanDeng001的博客 3286

对象锁(Object lock)

在Java中,对象锁可以通过synchronized关键字来实现。在并发编程中,多个线程可能同时访问共享对象,如果不采取任何措施来保护对象的一致性,可能会导致数据竞争和不确定的结果。对象锁通过在对象上设置锁,限制同时只有一个线程可以获取该锁,从而实现对对象的互斥访问。当一个线程获取到对象的锁之后,其他线程就需要等待,直到持有锁的线程释放锁为止。总结来说,对象锁是一种用于保护共享对象的同步机制,通过限制同时访问对象的线程数量来确保线程安全。提供了更灵活的锁定机制,允许更复杂的锁定和释放操作。

Nancy_0802的博客 1581

无人船 | 基于ROS的轻量级多无人艇自主导航仿真框架

无人水面艇USV是海上自主无人系统的关键组成部分,在民用、军用领域应用广泛,例如海上救援、水质测量、扫雷反潜等,因此对USV导航算法的研究具有重要意义。为了便于进行USV相关算法的验证与部署,本文介绍的这套基于ROS的多无人艇的自主导航仿真平台,轻量化地实现了建图、规划、控制等多种功能,同时自研框架保证了功能的高度可拓展和可定制

FRIGIDWINTER的博客 8002

Object.wait/notify和synchronized的协作

private static final Object LOCK = new Object(); private int i = 0; private static final int MAX_VALUE = 100; public static void main(String[] args) { try { Thread.sleep(5000); } catch (InterruptedException e)...

u012933335的博客 352

Python 爬虫实战:爬取哔哩哔哩知识区,抓取高赞课程信息

哔哩哔哩(Bilibili)是一个广受欢迎的综合性视频社区,其中的知识区汇聚了大量优质的教育、科普、技术等课程内容。本文将指导读者如何使用 Python 爬虫技术从哔哩哔哩知识区抓取高赞课程信息,并进行数据分析。本文深入探究了利用 Python 爬虫技术从哔哩哔哩知识区抓取高赞课程信息的全流程。从前期的环境搭建、模拟登录,到核心的课程数据抓取、存储,再到后续的数据分析与可视化,都详细展开讲解并提供代码支持。通过此方法所获取的数据,能够助力创作者优化内容、用户发现优质课程、平台洞察用户需求。

u014481728的博客 1136

Newton & Nvidia 开源 GPU 加速机器人仿真器入门教程(一)

Newton 是一个 GPU 加速、可扩展和可微分的物理仿真引擎,专为机器人、研究和高级仿真工作流而设计。Newton 基于 NVIDIA Warp 并集成了 MuJoCo Warp,为用户和开发人员提供了高性能仿真、现代 Python API 和灵活的架构。

机器人控制与仿真应用 1482

Objective-C中不同方式实现锁

为什么需要使用锁,当然熟悉多线程的你,自然不会对它觉得陌生。 实现锁的方法有四种。1.使用NSLockTestObj *obj = [[TestObj alloc] init]; NSLock *lock = [[NSLock alloc] init];//线程1 dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DE

MYGODLIU的博客 629

RD算法(一)初出茅庐 —— 算法原理

在《SAR成像概述》的第4节已经对各种SAR成像算法进行了一个简要的概述,本文就直接从RD算法讲起了。

5286

@synchronized 递归锁详解

如果你已经使用 Objective-C 编写过任何并发程序,那么想必是见过@synchronized这货了。@synchronized结构所做的事情跟锁(NSLock, 更准确的说法应该是NSRecursiveLock)类似:它可以防止不同的线程同时执行同一段代码。但在某些情况下,相比于使用NSLock创建锁对象、加锁和解锁来说,@synchronized用着更方便,可读性更高。 下面是SDWebImage中的代码, 给一个线程不安全的NSMapTable加递归锁, 保证NSMapTable的...

gcs的博客 1万+

老版QQ原生表情gif动态

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

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

【iOS锁_@synchronized源码浅析】

继续iOS锁的学习。在这里深入的学习的实现过程。结构所做的事情跟锁(lock)类似:它防止不同的线程同时执行同一段代码。但在某些情况下,相比于使用 NSLock 创建锁对象、加锁和解锁来说,用着更方便,可读性更高。但并不是在任意场景下都能使用,且它的性能较低。用法使用@synchronized指令指令是在Objective-C代码中实时创建互斥锁的便捷方式。指令会做任何其他互斥锁都会做的事情——它防止不同的线程同时获取相同的锁。然而,在这种情况下,您不必直接创建互斥量或锁定对象。

weixin_61639290的博客 2301

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

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

并发编程 - 锁(@synchronized)

synchronized的主要作用是确保某个代码在同一时刻只被一个线程执行,从而避免多个线程同时访问共享资源时发生数据竞争或不一致问题。举例来说,如果有多个线程同时读取和修改一个共享变量,可能会导致数据损坏或程序崩溃。通过@synchronized,我们可以将对共享资源的访问限制为一次只有一个线程可以操作。@synchronized为开发者提供了一种简洁且易用的同步机制。

weixin_39339407的博客 1134

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

@synchronized的使用

参考文档: [https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/Multithreading/ThreadSafety/ThreadSafety.html#//apple_ref/doc/uid/10000057i-CH8-SW1] 官方文档: The @synchronized dir...

frankisbaby的博客 1214

浅谈iOS @synchronized 锁用法

对于加锁解释以及iOS中多线程加锁方式@synchronized用法的简单讲解

Minecraft 5138

@synchronized 锁用法

synchronized   这个主要是考虑多线程的程序,这个指令可以将{ } 内的代码限制在一个线程执行,如果某个线程没有执行完,其他的线程如果需要执行就得等着。 Objective-C支持程序中的多线程。这就意味着两个线程有可能同时修改同一个对象,这将在程序中导致严重的问题。为了避免这种多个线程同时执行同一段代码的情况,Objective-C提供了@synchronized()指令。

NickQCX的博客 542

objective-c @synchronized 锁用法

via:  http://blog.youkuaiyun.com/zhangxingping   Objective-C除了提供异常处理机制外,还提供了线程同步功能。异常处理在前面的“异常处理”章节有介绍。   线程的同步执行 Objective-C支持程序中的多线程。这就意味着两个线程有可能同时修改同一个对象,这将在程序中导致严重的问题。为了避免这种多个线程同时执行同一段代码的情况,Obje...

windshg的专栏 187

objective-c中的@synchronized用法

看到项目代码里面,有这个,搜索了一下,原来是这么回事。 你是否在一些源代码中看到过如下语句: @synchronized(anobj) { //操作语句 } 如果你有过C#.net的开发你可能会见过这个: lock(obj) { //操作语句 }   用来控制多线程同步解决方案,保证此时没有其他线程对anobj对象进行修改 下面是国外一论坛原文: Using t

且行且看 2674

Swift -@synchronized

无并发,不编码。而只要一说到多线程或者并发的代码,我们可能就很难绕开对于锁的讨论。简单来说,为了在不同线程中安全的访问同一个资源,我们需要这些访问按顺序进行。Cocoa 和Objective-C 中加锁的方式有很多,但是在日常开发中最常用的应该是@synchronized,这个关键字可以用来修饰一个变量,并为其自动加上和解除互斥锁。这样,可以保证变量在作用范围内不会被其他线程改变。举个例子,如果我们有一个方法接受参数,需要这个方法时线程安全的话,就需要在参数上加锁: - (void)callMeWithPa

HumorousGhost 2142

关于 @synchronized,这儿比你想知道的还要多

本文翻译自 Ryan Kaplan 的 More than you want to know about @synchronized 因为原文一些内容写的不太准确,我按照我的理解做出了批注和补充。 如果你已经使用 Objective-C 编写过任何并发程序,那么想必是见过 @synchronized 这货了。@synchronized 结构所做的事情跟锁(lock)类似:它防止

rare_ice的博客 341

关于@synchronized 比你想知道的还多

如果你曾经使用Objective-C做过并发编程,那你肯定见过@synchronized这个结构。@synchronized这个结构发挥了和锁一样的作用:它避免了多个线程同时执行同一段代码。和使用NSLock进行创建锁、加锁、解锁相比,在某些情况下@synchronized会更方便、更易读。 如果你从来没有使用过@synchronized,具体如何使用可以参考下面的实例。本文的将围绕我对@syn...

weixin_30840253的博客 97
上一篇: 实现类似系统自带的提示框覆盖的效果
下一篇: xib的简单使用
sun_Winter
博客等级 码龄12年 1粉丝 34原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值