oc中synchronized的实现原理

在Objective-C(OC)中,synchronized的实现原理主要是基于对象锁(monitor lock)的机制来确保线程安全的。以下是对synchronized实现原理的详细解释:
1. 对象锁(Monitor Lock)
概念:每个Java对象(在OC中虽然不完全等同于Java,但原理相似)都有一个关联的监视器锁(monitor lock),也称为内置锁或内部锁。
作用:当一个线程访问被synchronized修饰的代码块或方法时,它首先会尝试获取对象的监视器锁。如果成功获取,则线程可以进入同步代码块或方法执行;如果失败(即锁已被其他线程持有),则线程会进入阻塞状态,等待锁的释放。
2. synchronized的使用
修饰实例方法:此时synchronized作用于当前对象实例,进入同步代码前要获得当前对象实例的锁。
修饰静态方法:给当前类加锁,会作用于类的所有对象实例,进入同步代码前要获得当前class的锁。
修饰代码块:指定加锁对象,对给定对象或类加锁。例如synchronized(this|object)或synchronized(类.class)。
3. 实现原理细节
对象头:OC对象(或Java对象)在内存中通常包含对象头、实例数据和对齐填充。对象头中包含了运行时元数据(如哈希值、GC分代年龄、锁状态标志等)和类型指针。
锁状态标志:在对象头中,有一个或多个位用于表示锁的状态。例如,当对象被某个线程持有时,这些位会被设置为特定的值,以表示锁的状态。
可重入性:OC(以及Java)中的synchronized是可重入的,即一个线程在持有某个对象的锁时,可以再次进入该对象的同步代码块或方法,而不会导致死锁。这是通过在对象头中维护一个计数器来实现的,计数器记录了每个线程获取对象锁的次数。
happens-before原则:在OC中,与Java类似,也存在一个happens-before原则,用于确保多线程环境下的数据可见性和正确性。当一个线程释放对象锁时,它会将修改后的共享变量刷新到主内存中,确保下一个获取同一个对象锁的线程能够看到这些修改。
锁的升级和降级:在某些情况下(如Java中),为了提高性能,锁的状态可能会从偏向锁、轻量级锁升级到重量级锁,或者在竞争降低时降级。然而,OC中是否实现了类似的锁升级和降级机制,可能需要具体查看OC的运行时实现或相关文档。
4. 总结
synchronized在OC中的实现原理主要是基于对象锁的机制来确保线程安全的。通过获取和释放对象的监视器锁,可以实现对共享资源的互斥访问,从而避免多线程读写操作时的线程安全风险。同时,OC(以及Java)中的synchronized还具有可重入性、满足happens-before原则等特性,以确保多线程环境下的数据一致性和正确性。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/20451.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python猜数字游戏

猜数字游戏 计算机随机产生一个1~100的随机数,人输入自己猜的数字, 计算机给出对应的提示“大一点”,”小一点“或”恭喜你猜对了“,直到猜中为止。 如果猜的次数超过7次,计算机温馨提示“智商余额明显不足” import …

如何在 JavaScript 中检查空字符串、未定义和 null 值?

在 JavaScript 编程中,遇到空字符串、未定义(undefined)或 null 值是相对常见的情况。为了确保代码的鲁棒性与稳定性,我们需要准确地识别这些值。本文将详细探讨识别空字符串、未定义和 null 值的方法,同时讨论其区别和应用场景。 什么是 “空字符串”、“未定义” 和 “…

SLAM精度评估—evo

evo是一款用于SLAM轨迹精度的评估工具。核心功能是(1)能够绘制(传感器运动)轨迹,(2)评估估计轨迹与真值(ground truth)的误差。evo支持多种数据集的轨迹格式(TUM、KITT、…

【Python】Python变量和函数的命名规范

基本原理 Python是一种广泛使用的高级编程语言,以其简洁性和可读性而闻名。在Python中,良好的命名规范对于编写清晰、易于维护的代码至关重要。Python社区遵循一套约定俗成的命名规范,这些规范有助于开发者之间的协作,并使代码更…

用户购物性别模型标签(USG)之决策树模型

一、USG模型引入: 首先了解一下,如何通过大数据来确定用户的真实性别, 经常谈论的用户精细化运营,到底是什么? 简单来讲,就是将网站的每个用户标签化,制作一个属于用户自己的网络身份证。然后,运营人员 通…

D3D 顶点格式学习

之前D3D画三角形的代码中有这一句, device.VertexFormat CustomVertex.TransformedColored.Format; 这是设置顶点格式; 画出的三角形如下, 顶点格式是描述一个三维模型的顶点信息的格式;可以包含以下内容, 位置…

Python3 笔记:每天一个函数——str.join()

join() :连接字符串数组。将字符串、元组、列表中的元素以指定的字符(分隔符)连接生成一个新的字符串。 语法:sep.join(seq) 参数说明: sep:分隔符。可以为空。 seq:要连接的元素序列、字符串…

Xcode设置cocoapods库的最低兼容版本

目录 前言 1.使用cocoapods遇到的问题 2.解决办法 1.用法解释 1. config.build_settings: 2.IPHONEOS_DEPLOYMENT_TARGET 2.使用实例 3.注意事项 1.一致性 2.pod版本 前言 这篇文章主要是介绍如何设置cocoapods三方库如何设置最低兼容的版本。 1.使用cocoapods遇到的…

回溯法(复习笔记一)

目录 前言 回溯法引入: 一、回溯法 二、实例分析 数字组合问题 三、基本步骤 回溯法的基本步骤: 剪枝的正确性: ※重点提醒 四、深度剖析 递归算法: 非递归算法: 总结 前言 回溯法引入: 搜索…

qt学习笔记

qt的对象树 在 Qt中创建对象的时候会提供一个 Parent 对象指针,Q0bject是以对象树的形式组织起来的。 当你创建一个 Q0biect 对象时,会看到 Q0biect 的构造函数接收一个Q0b.ject指针作为参数,这个参数就是 parent,也就是父对象指…

Typescript高级: 深入理解infer关键字

概述 在 TS 中,infer 是一个高级类型操作,特别是条件类型和映射类型中非常有用的关键字它在泛型中使用也会是一个强大工具,增强了类型推断的能力,让开发者更灵活地处理和操作类型它允许在泛型类型推导过程中捕获一个具体的类型&a…

三次样条插值的实现(Matlab)

一、问题描述 三次样条插值的实现。 二、实验目的 掌握三次样条插值方法的原理,能够编写代码获得自然、抛物线端点以及非纽结三次样条。 三、实验内容及要求 找出并画出三次样条S,满足S(0) 1, S(1) 3, S(2) 3, S(3) 4, S(4) 2,其中…

Spring Boot 开发 -- 过滤器与拦截器详解

引言 在Web开发中,经常需要对请求进行预处理或在响应后进行后处理,Spring Boot提供了过滤器和拦截器两种机制来实现这一需求。虽然它们都可以用来处理HTTP请求和响应,但在使用场景、执行顺序和配置方式上存在明显的差异。本文将详细讲解Spri…

LeetCode 2928.给小朋友们分糖果 I:Java提交的运行时间超过了61%的用户

【LetMeFly】2928.给小朋友们分糖果 I:Java提交的运行时间超过了61%的用户 力扣题目链接:https://leetcode.cn/problems/distribute-candies-among-children-i/ 给你两个正整数 n 和 limit 。 请你将 n 颗糖果分给 3 位小朋友,确保没有任何…

【面试宝藏】Go基础面试题其一

探索Go语言:特性、用法与最佳实践 Go语言(Golang)自发布以来迅速成为开发者社区中的热门选择。本文将探讨Go语言的优势、数据类型、包管理、类型转换、并发处理、同步机制、通道特性及其使用中的注意事项等内容,并回答一些常见的…

微信小程序的事件绑定方式

微信小程序的事件绑定方式主要包括以下几种,每种方式都有其特定的用法和特性: 基础绑定方式: bind:这是最基础的绑定方式,用于绑定事件处理函数。例如,bindtap用于绑定点击事件。当组件触发事件时&#xf…

易语言贪吃蛇游戏(附带源码)

易语言贪吃蛇游戏 效果图源码说明源码领取下期更新预报 效果图 源码说明 本源码用易语言来编写,供大家研究,保留版权,谢谢! 源码领取 易语言贪吃蛇游戏源码领取地址:https://www.123pan.com/s/ji8kjv-TKPU3.html提取…

Oracle中rman的增量备份使用分享

继上次使用RMAN的全量备份和异机还原以后,开始研究一下增量备份和还原的方法。相比于全量RMAN的备份还原,增量的备份还原就相对简单。本实践教程直接上操作,还是回归到一个问题,就是关于两个数据库创建时候,必须保持or…

泄漏libc基地址

拿libc基地址 方法一:格式化字符串 格式化字符串,首先确定输入的 AAAA 在栈上的位置(x)。使用 elf.got[fun] 获得got地址。利用格式化字符串,构造payload泄漏got地址处的值,recv接受到的字符串中&#xf…

linux部署运维1——centos7.9离线安装部署web或java项目所需的依赖环境,包括mysql8.0,nginx1.20,redis5.0等工具

在实际项目部署运维过程中,如果是云服务器,基本安装项目所需的依赖环境都是通过yum联网拉取网络资源实现自动化安装的;但是对于一些特殊场合,在没有外部网络的情况下,就无法使用yum命令联网操作,只能通过编…