atomic不是绝对的线程安全.atomic的本意是指属性的存取方法是线程安全的,并不保证整个对象是线程安全的 @property (atomic, assign) int intA; //线程A for (int i = 0; i < 10000; i ++) { self.intA = self.intA + 1; NSLog(@"Thread A: %d\n", self.intA); } //线程B for (int i = 0; i < 10000; i ++)…
atomic(原子的),顾名思义,原子操作应该是线程安全的,然而,真相并不是! @property (atomic, strong) NSMutableArray *arr; // 多线程操作arr并不安全  因为atomic关键字只是保证了getter和setter的原子性,相当于分别在这两个方法首尾加解锁,即不会有多个线程同时调用getter或者setter,伪码如下: - (void)setArr:(NSMutableArray *)arr { lock; self.arr = arr;…
我们在学习OC的时候认为,atomic使用了原子性,保证了线程安全,事实真的是这样吗? nonatomic的内存管理语义是非原子性的,非原子性的操作本来就是线程不安全的,而atomic的操作是原子性的,但是并不意味着它是线程安全的,它会增加正确的几率,能够更好的避免线程的错误,但是它仍然是线程不安全的. 当使用nonatomic的时候,属性的setter,getter操作是非原子性的,所以当多个线程同时对某一属性读和写操作时,属性的最终结果是不能预测的. 当使用atomic时,虽然对属性的读和写…
咳咳.C++11 加入了线程库,从此告别了标准库不支持并发的历史.然而 c++ 对于多线程的支持还是比较低级,稍微高级一点的用法都需要自己去实现,譬如线程池.信号量等.线程池(thread pool)这个东西,在面试上多次被问到,一般的回答都是:“管理一个任务队列,一个线程队列,然后每次取一个任务分配给一个线程去做,循环往复.” 貌似没有问题吧.但是写起程序来的时候就出问题了. 废话不多说,先上实现,然后再啰嗦.(dont talk, show me ur code !) 代码实现 #pragm…
一般如果我们自己写一个计数器方法,需要考虑线程安全问题,尤其高并发访问的时候. AtomicLong 已处理并发问题,直接使用.java.util.concurrent.atomic包提供多种线程安全计数器 import java.util.concurrent.atomic.AtomicLong; public class Counter { private static AtomicLong counter = new AtomicLong(0); public static long ad…
简介 volatile关键字保证了在多线程环境下,被修饰的变量在别修改后会马上同步到主存,这样该线程对这个变量的修改就是对所有其他线程可见的,其他线程能够马上读到这个修改后值. Thread的本地内存 每个Thread都拥有自己的线程存储空间 Thread何时同步本地存储空间的数据到主存是不确定的 例子 借用Google JEREMY MANSON 的解释,上图表示两个线程并发执行,而且代码顺序上为Thread1->Thread2 1. 不用 volatile 假如ready字段不使用volat…
咳咳.C++11 加入了线程库,从此告别了标准库不支持并发的历史.然而 c++ 对于多线程的支持还是比较低级,稍微高级一点的用法都需要自己去实现,譬如线程池.信号量等.线程池(thread pool)这个东西,在面试上多次被问到,一般的回答都是:“管理一个任务队列,一个线程队列,然后每次取一个任务分配给一个线程去做,循环往复.” 貌似没有问题吧.但是写起程序来的时候就出问题了. 废话不多说,先上实现,然后再啰嗦.(dont talk, show me ur code !) 代码实现 #pragm…
一.atomic介绍 github对应Demo:https://github.com/Master-fd/LockDemo 在iOS中,@property 新增属性时,可以增加atomic选项,atomic会给对应对setter方法加锁,相当于 - (void)setTestStr:(NSString *)testStr{    @synchronizad(lock){        if (testStr != _testStr) {            [_testStr release]…
场景:如今项目中有这样一个场景,在一个自定义类型的Property在一个线程中改变的同时也要同时在另一个线程中使用它,使我不得不将Property定义成atomic,但是由此发现atomic并不会保证线程安全,由此我深入查询了解下atomic 与 nonatomic,发现自己之前并不了解atomic 与 nonatomic. 正文: 首先,我们先要弄懂一个问题:什么是原子性? 原子操作是不可分割的操作,在原子操作执行完毕之前,其不会被任何其它任务或事件中断. 被标注atomic会保证这种对Pro…
一. 条件变量 (一)条件变量概述 多线程访问一个共享资源(或称临界区),不仅需要用互斥锁实现独享访问避免并发错误,在获得互斥锁进入临界区后,还需检查特定条件是否成立.当某个线程修改测试条件后,将通知其它正在等待条件的线程继续往下执行. 1. wait线程:如果不满足该条件,拥有条件变量的wait线程会先释放该互斥锁,并把自身放入条件变量内部的等待队列,阻塞等待条件成立. 2. notify线程:在wait线程阻塞期间,notify线程获取互斥锁并进入临界区内访问共享资源,然后改变测试条件,当条…
前言 当项目中有频繁创建线程的场景时,往往会用到线程池来提高效率.所以,线程池在项目开发过程中的出场率是很高的. 那线程池是怎么工作的呢?它什么时候创建线程对象,如何保证线程安全... 什么时候创建线程对象 当实例化线程池对象时,并没有预先创建corePoolSize个线程对象,而是在调用execute或submit提交任务时,才会创建线程对象. 工作流程 public void execute(Runnable command) { int c = ctl.get(); // 1. 如果核心线…
前言: 目前网上的c++线程池资源多是使用老版本或者使用系统接口实现,使用c++ 11新特性的不多,最近研究了一下,实现一个简单版本,可实现任意任意参数函数的调用以及获得返回值. 0 前置知识 首先介绍一下用到的c++新特性 可变参数模板:利用这一特性实现任意参数的传递 bind函数,lambda表达式: 用于将带参数的函数封装为不带形参和无返回值的函数,统一接口 forward: 完美转发,防止在函数封装绑定时改变形参的原始属性(引用,常量等属性) shared_ptr, unique_ptr…
1.  NSLog           是Foundation提供的一个输出函数,它的功能非常强大,不仅可以输出字符串,还可以输出各种对象,到后面程序还会见到大量的使用NSLog()函数. 2.  NS          是一个前缀,Cocoa对其所有函数.常量.类型前面都会增加“NS”前缀,该前缀用于区分该函数来自Cocoa,而不是来自其它程序包 3.常用扩展名 .c   C语言的源程序 .cpp  .cc    C++的源程序 .h    头文件 .m   oc源程序 .mm  oc++源程…
一.基本使用1.创建和启动线程一个NSThread对象就代表一条线程 创建.启动线程NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(run) object:nil];[thread start];// 线程一启动,就会在线程thread中执行self的run方法 主线程相关用法+ (NSThread *)mainThread; // 获得主线程- (BOOL)isMainThread; //…
最近觉得现在所在公司平台用户量太少,自身技术已经到了一个瓶颈,是时候需要换一个用户量多的平台,好好研究下iOS的性能优化.内存优化等问题了. 所面试的公司由于一些默认的规定,就不多说了,大致是面了一个下午,从2点到下午6点半,正式拿到offer,先从笔试题开始说起吧. 笔试题:15道题,稍微有些多了,做了将近一个半小时.从笔试题就可以稍微看出一个公司的iOS团队技术水平如何,以及他们是不是真的想要招人.我春节之前投过一波简历,当时挑了一家公司去,还没技术面,只是看了他们的面试题,就知道了这个公司…
第四章 并行程序优化 1.非阻塞同步避免了基于锁的同步的缺陷,无锁算法没有锁竞争带来的系统开销,也没有线程间频繁调度带来的开销.CAS算法:包含3个参数CAS(v,e,n).V表示要更新的变量,E表示预期值,N表示新值2.JDK的java.util.concurrent.atomic包下,有一组使用无锁算法实现的原子操作类,如AtomicInteger/AtomicIntegerArray/AtomicLongArray等, 分别包装了对整数.整数数组.长整形数组等的多线程安全操作. 如: pu…
普通方法:关注(代表)对象可以”干什么”,过程中需要实例变量.-(void)show;输出 … 访问属性    属性:属性专门处理实例变量.(程序执行过程当中)    初始化方法:一创建对象(第一时间),给实例变量赋值.    工厂方法:只一个方法,帮我们解决创建对象问题.初始化对象的问题.工厂方法创建对象最简单.(对象达到一定量级) 补:在类方法中,可以调用类中创建的实例的实例方法或实例变量. 算法.设计模式:是人们总结的一种规律,一种思想. 1.单例模式    是一种特殊的工厂方法.    …
下面只是对读到的所有 Tips 结合我平时开发中遇到的问题进行总结,每一个 Tips 和书中的每一条对应,本文的目的是去掉书中的大部分讨论的内容,让人能够马上使用这些 Tips,建议阅读过原书后食用更佳. CHAPTER 1 熟悉 OBJECTIVE-C Tips 1 Objective-C 的起源 Objective-C 是从 C 语言演化而来,有 C 的一些基础会有很大帮助 Tips 2 头文件中减少引用 减少在类的头文件中 import 其他头文件,如果使用其他类,那么使用@class C…
内存管理和@property的属性 目录 对内存管理的理解 Objective C内存管理方式 内存的管理 对象的所有权和内存管理原则 合理解决内存管理带来的问题 自动释放池 @property的属性 ARC自动引用计数 对内存管理的理解 Objective C内存管理方式 MRC(Manual Reference Counting)手动引用计数——需要程序员手动管理内存 ARC(Automatic Reference Counting)自动引用计数——由系统自动管理内存(实质为编译预处理器给程…
最近看C++11 atomic发现对memory_order很是不理解,memory_order_relaxed/memory_order_consume/memory_order_acquire/memory_order_release/memory_order_acq_rel/ memory_order_seq_cst.这些都是跟memory model有关 关于memory model,对于线程来说,其实是跟编译器相关的.因为我们的编译器在把C++语言翻译成机器代码的时候,会进行各种优化.…
6.ThredPoolExecutor ThredPoolExecutor是基于命令模式下的一个典型的线程池的实现,主要通过一些策略实现一个典型的线程池,目前已知的策略有ThreadPoolExecutor.AbortPolicy, ThreadPoolExecutor.CallerRunsPolicy, ThreadPoolExecutor.DiscardOldestPolicy, ThreadPoolExecutor.DiscardPolicy.废话不多说,我们来看一个示例: package…
iOS常见面试题汇总 1. 什么是 ARC? (ARC 是为了解决什么问题而诞生的?) ARC 是 Automatic Reference Counting 的缩写, 即自动引用计数. 这是苹果在 iOS5 中引入的内存管理机制. Objective-C 和 Swift 使用 ARC 追踪和管理应用的内存使用. 这一机制使得开发者无需键入retain 和 release , 这不仅能够降低程序崩溃和内存泄露的风险, 而且可以减少开发者的工作量, 能够大幅度提升程序的流畅性和可预测性. 但是 AR…
搞编程做项目的,没碰到bug.遇到问题,基本不可能.stackoverflow就是一个大型的开放的FAQ平台,你是问题制造者,也是答案提供者.本文列出至今stackoverflow上关于iOS的票数最高(最常见)的15个问题,仅为了大家能够更方便.直接.快速的找到自己想要的答案,也许其中某个(些)问题就是你已经碰到或者即将碰到的. (这里的答案都是简单描述,有需要的话可以进入问题原页面查看详细答案) 一.怎么把UILabel的内容竖直方向靠上排列 我们都知道NSTextAlignment有五个值…
测试结论是发现C++11原子操作在性能上,比以往用到的InterlockedIncrement或__sync_add_and_fetch性能上慢了1倍左右. 另外补充一点,在对原子变量进行比较的时候,最好是引用它操作后的返回值,而不要直接用原子变量进行比较,比如: 下面是测试过程以及代码 std::atomic<; long v = ++g_data; ) { dosomething(); } //不要用下面的方式,可能某个线程已将g_data原子的值设置为了1000,而引起不只一个线程执行下面…
eventLoop是基于事件系统机制,主要技术由线程池同队列组成,是由生产/消费者模型设计,那么先搞清楚谁是生产者,消费者内容 SingleThreadEventLoop 实现 public abstract class SingleThreadEventLoop extends SingleThreadEventExecutor implements EventLoop { private final Queue<Runnable> tailTasks; @Override protecte…
我的工程结构,如图 1-0 图  1-0 在看具体实现以前,先捋以下 实现思路. ViewController 中有一个-(void)Amethod;A方法. -(void)Amethod{ NSLog(@"Amethod"); } 1.swizzle method 在ViewController 的 -(void)viewDidLoad中调用 Amentohd:运行输出                   图 1-1 创建一个ViewController 的Category,重写+(…
1.一个类重写了operator(),可以f()-相当于匿名对象-f()()相当于调用operator()函数  把对象名当成函数名来使用--伪函数 2.通过成员函数创建多线程 a)   可以用成员函数去实现多进程 多线程最好函数不要重名 利用成员函数构建多线程 毕竟成员函数是共享的 b) thread th3(&fun::run2, f1, "xuxu","hello"); 成员函数,调用的对象,参数 继承thread:对于继承含有模板的类的套路: 线程也…
1.可见性(Visibility) 可见性是指,当一个线程修改了某一个全局共享变量的数值,其他线程是否能够知道这个修改. 显然,在串行程序来说可见性的问题是不存在的.因为你在任何一个地方操作修改了某个变量,那么在后续的程序里面,读取这个变量的数值,一定是修改后的数值. 但是,这个问题在并行程序里面就不见得了.在并行程序里面,如果一个线程修改了某一个全局变量,那么其他线程未必可以马上知道这个变动.下面的图1展示了可见性问题的一种.如果在CPU1和CPU2上各运行一个线程,他们共享变量t,由于编译器…
1. Java中length,length方法,size方法区别 length属性:用于获取数组长度. length方法:用于获取字符串长度. size方法:用于获取泛型集合有多少个元素. 2. isEmpty方法 isEmpty方法用来判断是否为空,很多类都有,比如String.Queue.Stack类. 3.  Queue中 add/offer,element/peek,remove/poll方法 add         增加一个元索                         如果队列…
免责声明:     本文内容多来自网络文章,转载为个人收藏,分享知识,如有侵权,请联系博主进行删除. 1.3.锁机制 说说线程安全问题,什么是线程安全,如何保证线程安全 线程安全:当多个线程访问某一个类(对象或方法)时,这个类始终都能表现出正确的行为,那么这个类(对象或方法)就是线程安全的. 非线程安全:非线程主要是指多个线程对同一个对象中的同一个实例变量进行操作时会出现值被更改.值不同步的情况,进而影响程序的执行流程. 按照"线程安全"的安全程度由强到弱来排序,我们可以将java语言…