作者:何甜甜在吗 来源:http://1t.click/a7Gm 在项目开发过程中经常遇到时间处理,但是你真的用对了吗,理解阿里巴巴开发手册中禁用static修饰SimpleDateFormat...在多并发情况下使用SimpleDateFormat需格外注意 SimpleDateFormat除了format是线程不安全以外,parse方法也是线程不安全的。...calb中中属性设置cal c、返回设置好的cal对象 但是这三步不是原子操作 多线程并发如何保证线程安全 - 避免线程之间共享一个SimpleDateFormat对象,每个线程使用时都创建一次SimpleDateFormat...=> 较好的方法 1.Date对时间处理比较麻烦,比如想获取某年、某月、某星期,以及n天以后的时间,如果用Date来处理的话真是太难了,你可能会说Date类不是有getYear、getMonth这些方法吗...yyyy");String s3 = localDate.format(dateTimeFormatter); DateTimeFormatter默认提供了多种格式化方式,如果默认提供的不能满足要求,可以通过
这就是为什么我认为分享这些简单的技巧是非常重要的,这些技巧可以帮助我们避免过多的使用 if 语句。...接下来会介绍6种方式来代替 if 的使用,这样做不是坚决不使用 if 偏执狂,而是换个方式思考我们的编码思路。 1....4.非分支策略 此技巧尝试避免使用switch语句,相反是用键/值创建一个映射并使用一个函数访问作为参数传递的键的值。...", })[breed]||'Im the default'; dogSwitch("border xxx") 5.作为数据的函数 我们知道在JS中函数是第一个类,所以使用它我们可以把代码分割成一个函数对象...OOP中多态性最常见的用法是使用父类引用来引用子类对象。
首先,看.h文件 根据定义,我们发现pthread_mach_thread_np主要是将pthread_t的类型转换成mach_port_t类型,这里有个知识点,线程的类别,主要可分为三种 1.glibc...由于一些原因,没有梯子可以用,我在baidu浪费了几个小时没有任何结果,在快要崩溃的边缘终于在bing搜索找到了答案。。。...在线推荐bing一波) 首先看一个案例(截图来源于网络搜索,如有侵权请告知) https://codereview.chromium.org/276043002/ 在某项目的CR过程中,评审人不推荐使用...,不需要mach_port_deallocate()进行释放,同时,配对使用mach_thread_self()和mach_port_deallocate()进行两次系统调用,而pthread_mach_thread_np...(pthread_self())不要系统调用,也不要配对使用,推荐优先使用 如果因一些原因一定要使用mach_thread_self(),可以学习kscrash进行封装。
/ Windows 等系统跨平台使用,使用 C 语言编写,需要程序员自己管理线程的生命周期,使用难度较大,我们在 iOS 开发中几乎不使用 pthread,但是还是来可以了解一下的。...但是 Microsoft Windows 上的实现也存在,例如直接使用 Windows API 实现的第三方库 pthreads-w32;而利用 Windows 的 SFU/SUA 子系统,则可以使用微软提供的一部分原生...NSThread NSThread 是苹果官方提供的,使用起来比 pthread 更加面向对象,简单易用,可以直接操作线程对象。...不过也需要需要程序员自己管理线程的生命周期(主要是创建),我们在开发的过程中偶尔使用 NSThread。比如我们会经常调用[NSThread currentThread]来显示当前的进程信息。...可以看到在不考虑线程安全的情况下,得到票数是错乱的,这样显然不符合我们的需求,所以我们需要考虑线程安全问题。
每个应用程序启动时候都是一个线程,它执行程序的 main 函数。应用程序可以生成额外的线程,其中每个线程执行一个特定功能的代码。...比如,一个使用 run loop 的线程可能在每次运行完一次循环的时候创建并释放该自动释放池。更频繁的释放对象可以防止你的应用程序内存占用太大造成性能问题。...在类Unix操作系统(Unix、Linux、Mac OS X等)中,都使用Pthreads作为操作系统的线程,这是一套在很多操作系统上都通用的多线程API,所以移植性很强(然并卵),当然在 iOS 中也是可以的...(@"%@", [NSThread currentThread]); return NULL; } 三、NSThread 我们应该避免显式地创建线程,你可以考虑使用异步 API,GCD 方式,或操作对象来实现并发...,而不是自己创建一个线程。
一些与 UI 无关的操作应该放到全局队列来执行,而不是主队列。比如网络请求这类操作。...此时,任务1 等待任务完成,自己才能完成;而 任务2 等待 任务1 完成,自己才能开始执行。 是不是跟死锁的机制一模一样:我在等着你,而你也在等着我。 没错!!!...kqueue 可以称为应用程序处理 XUN 内核中丰盛各种事件的方法中最优秀的一种。...当然,我们也可以自定义子类(AFNetworking 中自定义了 一个子类 AFURLConnectionOperation)。...我们可以使用 addExecutionBlock: 方法来为 NSBlockOperation 添加任务。
概要 RunLoop在iOS开发中的应用范围并没有像runtime 那样广泛,我们通过CFRuntime的源代码可知runloop跟线程的是密不可分的,一个线程一定会创建一个对应的runloop,只是主线程创建就自动...此外,runloop并不是一个简单的do-while,作为OSX/iOS系统中Event Loop表现,runloop需要处理消息事件,在没有消息的时候休眠,有消息事件的时候立刻唤醒。 ...`thread_start + 13 根据苹果线程管理的说法可以利用把线程放入runloop中,我们知道子线程的runloop并没有自动开启,需要我们手动开启,苹果也提供代码示例: - (void)threadMainRoutine...currentRunLoop]; [runLoop runUntilDate:[NSDate distantFuture]]; // _pthread_exit } 可以我们把代码修改成在界面添加一个按钮点击事件...,同时也可以让用户上传crash日志,早期我还是看到APP在使用这样的技术,现在crash收集机制越来越完善,目前来说几乎有这么使用的了。
网络配图.jpg 目录 1. pthread 1.1 pthread 介绍 1.2 pthread 的简单使用 2....NSThread 2.1 NSThread 介绍 2.2 NSThread 的基本使用 2.3 线程的状态、生命周期 2.4 线程池的原理 2.5 线程的属性 相关链接 1. pthread...API; 适用于 Unix / Linux / Windows 等系统; 跨平台/可移植; 使用难度大、使用频率低; 线程生命周期由程序员管理; 现在 iOS 中用到 pthread 的多数情况是使用...NSThread 2.1 NSThread 介绍 使用更加面向对象; 简单易用,可直接操作线程对象; 语言 OC,线程生命周期由程序员管理,偶尔使用。...线程的优先级: 内核调度算法在决定该运行哪个线程时,会把线程的优先级作为考量因素,较高优先级的线程会比较低优先级的线程有更多的运行机会。
// 何时回收线程不需要你考虑 pthread_t thread2; pthread_create(&thread2, NULL, run, NULL); } NSThread...,开发中我们操作线程大多都使用 GCD 和 NSOperation 来实现多线程操作。...currentThread]); } }); }); // 主队列:(任何一个任务只要在主队列中,都会加入到主线程的队列中执行) 注意:使用sync函数(同步函数)往当前串行队列中添加任务...单例模式:在整个应用程序中,共享一份资源(这份资源只需要创建初始化1次) static id _person; + (instancetype)sharePerson { static dispatch_once_t...,我们可以实现小图片的多图片下载。
[1240] 正式因为多线程能够在时间片里被CPU快速切换,造就了以下优势 资源利用率更好 程序设计在某些情况下更简单 程序响应更快 但是并不是非常完美,因为多线程常常伴有资源抢夺的问题,作为一个高级开发人员并发编程那是必须要的...在复杂的场合下,比如我们要保证一个复杂的数据结构更改的原子性,原子操作指令就力不从心了, 如果临界区的执行时间过长,使用自旋锁不是个好主意。...因此objc_sync_exit是在_SYNC_EXIT结构体中的析构函数中调用,参数同样是当前加锁的对象。...breakpoint on objc_sync_nil to debug"); } objc_sync_nil(); } done: return result; } 复制代码 从上面的源码中我们可以得出你调用...换句话说:使用条件变量可以让许多线程一起等待某个时间的发生,当某个时间发生时,所有的线程可以一起恢复执行!
RunLoop会在第一次获取它时创建; RunLoop销毁时机:RunLoop会在线程结束时销毁; 主线程的RunLoop已经自动获取(创建),子线程默认没有开启RunLoop; 主线程的RunLoop对象是在UIApplicationMain...CFRunLoopGetMain(); // 获取主线程的 RunLoop 对象 CFRunLoopGetCurrent(); // 获取当前线程的 RunLoop 对象 我们来看一下...CFRunLoopRunInMode(kCFRunLoopDefaultMode, 1.0e10, false); // 第3个参数:设置为 true,代表执行完 Source/Port 后就会退出当前 loop 我们来看一下...CFRunLoopRunSpecific()函数来启动RunLoop,而该函数实现已在《深入浅出 RunLoop(三):事件循环机制》文章中讲解到。...self.thread) return; // 在子线程调用(waitUntilDone设置为YES,代表子线程的代码执行完毕后,当前方法才会继续往下执行) [self performSelector
正式因为多线程能够在时间片里被CPU快速切换,造就了以下优势 资源利用率更好 程序设计在某些情况下更简单 程序响应更快 但是并不是非常完美,因为多线程常常伴有资源抢夺的问题,作为一个高级开发人员并发编程那是必须要的...在复杂的场合下,比如我们要保证一个复杂的数据结构更改的原子性,原子操作指令就力不从心了, 如果临界区的执行时间过长,使用自旋锁不是个好主意。...因此objc_sync_exit是在_SYNC_EXIT结构体中的析构函数中调用,参数同样是当前加锁的对象。...breakpoint on objc_sync_nil to debug"); } objc_sync_nil(); } done: return result; } 从上面的源码中我们可以得出你调用...换句话说:使用条件变量可以让许多线程一起等待某个时间的发生,当某个时间发生时,所有的线程可以一起恢复执行!
RunLoop与线程 首先,iOS 开发中能遇到两个线程对象: pthread_t 和 NSThread。...苹果并没有提供这两个对象相互转换的接口,但不管怎么样,可以肯定的是 pthread_t 和 NSThread 是一一对应的。...比如,你可以通过 pthread_main_np() 或 [NSThread mainThread] 来获取 主线程;也可以通过 pthread_self() 或 [NSThread currentThread...CFRunLoopMode对象,但是我们可以调用CFRunLoopAddCommonMode 传入一个字符串向 RunLoop 中添加 Mode,传入的字符串即为 Mode 的名字,Mode对象应该是此时在...在 Cocoa 中这需要你给本地端口指定一个名字,并将名字传递到远程线程以便远程线程可以获得合适的端口对象用于通信。以下代码显示端口创建,注册到你想要使用消息端口的进程。
RunLoop 的概念 大家在平时使用 iPhone 中的 APP 的时候会发现,当你静止不进行任何操作的时候,好像 APP 休眠了,但是当你点击按钮的时候,就会立即触发一个事件,仿佛 app 一直在待命...RunLoop 与线程的关系 首先,iOS开发中能遇到两个线程对象: pthread_t 和 NSThread 。...苹果并没有提供这两个对象相互转换的接口,但不管怎么样,可以肯定的是 pthread_t 和 NSThread 是一一对应的。...比如,你可以通过 pthread_main_thread_np() 或 [NSThread mainThread] 来获取主线程;也可以通过 pthread_self() 或 [NSThread currentThread...例如添加另一个非基于端口的输入源Source0来唤醒 RunLoop ,这样可以立即处理输入源,而不是等到其他事件发生。 下面是一个示意图: ?
安全隐患解决 我们可以看出,当线程A访问数据并对数据进行操作的时候,数据被加上一把锁,这个时候其他线程都无法访问数据,知道线程A结束返回数据,线程B此时在访问数据并修改,就不会造成数据错乱了。...2.5 NSThread线程之间的通信 什么叫做线程间通信 在1个进程中,线程往往不是孤立存在的,多个线程之间需要经常进行通信,例如我们在子线程完成下载图片后,回到主线程刷新UI显示图片 线程间通信的体现...currentThread]); }); 因为这个方法在主线程中,给主线程中添加任务,而同步函数要求立刻马上执行,因此就会相互等待而发生死锁。...第二个参数:要执行的代码 如果想让延迟的代码在子线程中执行,也可以更改在哪个队列中执行 dispatch_get_main_queue() -> dispatch_get_global_queue...NSLog(@"1------%@",[NSThread currentThread]); }]; //2.追加操作,追加的操作在子线程中执行,可以追加多条操作 [op addExecutionBlock
扩展 pthread 也是C 语言API(pthread现在已经基本看不到有使用的了),而NSThread 是Objective-C对pthread的封装;虽然GCD也是C语言API,但是非常容易使用,...GCD是在libdispatch框架内,而该框架是iOS 应用默认的已经包含进去了。 苹果是在 OS X 10.6 和 iOS 4 中引入了 GCD,它是低层级的C语言 API。...使用GCD,它能够让开发者更加方便、更加容易得使用多核CPU。而且我们开发者不需要再直接跟线程打交道了,只需要向队列中添加代码块即可,而GCD 在后端其实是管理着一个线程池。...而并发队列就是同时有多个任务在执行,同时执行的任务哪个先执行完,我们根本不知道。...这里也可以看出一个GCD的优点,它会复用之前使用过的闲置的线程。
那么,我们只需要在主线程的RunLoop中添加一个observer,检测从 kCFRunLoopBeforeSources 到 kCFRunLoopBeforeWaiting 花费的时间 是否过长。...如果花费的时间大于某一个阙值,我们就认为有卡顿,并把当前的线程堆栈转储到文件中,并在以后某个合适的时间,将卡顿信息文件上传到服务器。...因为主线程中的block、交互事件、以及其他任务都是在kCFRunLoopBeforeSources 到 kCFRunLoopBeforeWaiting 之前执行,所以我在即将开始执行Sources 时...为了能够捕获到堆栈信息,我把timer的间隔调的很小(0.01),而评定为卡顿的阙值也调的很小(0.01)。 实际使用时这两个值应该是比较大,timer间隔为1s,卡顿阙值为2s即可。...可以参考微信的做法,7天以上的文件删除,随机抽取上传,并且上传前对文件进行压缩处理等。 文中的示例代码都来自:RunLoopDemos中的RunLoopDemo03
由于OC是C语言的超集,开发者也可以选择使用POSIX标准的线程pthread,pthread和NSThread都是对内核mach kernel的mach thread的封装,所以在开发时一般不会使用pthread...NSThread的使用姿势全解 在组织架构说明中讲到,NSThread是对内核mach kernel中的mach thread的封装,所以,每一个NSThread的对象其实就是一个线程,我们创建一个NSThread...通过很简单的代码就可以创建一个新的线程来执行任务,在开发中尽量将耗时的操作放在其他线程中执行,只将更新UI的操作放在主线程中执行。...线程执行体执行时应用线程信息 从上图可以看到,现在程序中有一个线程名为firstThread,该线程即为我们创建的NSThread对象,而com.apple.main-thread(serial)即为主线程的名称...currentThread] name]); } [self.lock unlock]; } 在栗子2中,我们对draw:方法添加了一个同步代码块,使用@synchronized包围的代码即为同步代码块
NSStringFromClass([AppDelegate class])); } } 重点是UIApplicationMain()函数,这个方法会为main thread设置一个NSRunLoop对象,这就解释了:为什么我们的应用可以在无人操作的时候休息...NSRunLoop *runloop = [NSRunLoop currentRunLoop]; 相对底层: iOS 开发中能遇到两个线程对象: pthread_t 和 NSThread。...可以肯定的是 pthread_t 和 NSThread 是一一对应的。...比如,你可以通过 pthread_main_thread_np() 或 [NSThread mainThread] 来获取主线程;也可以通过 pthread_self() 或 [NSThread currentThread...这个mode时不会被加载而影响到。
} } 输出结果: 可以看到:在没有使用 NSOperationQueue、在主线程中单独使用使用子类 NSInvocationOperation 执行一个操作的情况下,操作是在当前线程执行的,并没有开启新线程...当最大操作并发数为2时,操作是并发执行的,可以同时执行两个操作。而开启线程数量是由系统决定的,不需要我们来管理。 这样看来,是不是比 GCD 还要简单了许多? 6....但是我们可以通过setQueuePriority:方法来改变当前操作在同一队列中的执行优先级。...可以看到:在不考虑线程安全,不使用 NSLock 情况下,得到票数是错乱的,这样显然不符合我们的需求,所以我们需要考虑线程安全问题。...可以看出:在考虑了线程安全,使用 NSLock 加锁、解锁机制的情况下,得到的票数是正确的,没有出现混乱的情况。我们也就解决了多个线程同步的问题。 10.