240 发简信
IP属地:云南
  • 120
    GPUImage详细解析(六)-用视频做视频水印

    回顾 之前解析介绍的是GPUImage源码解析、图片模糊、视频滤镜,明白了GPUImage的强大功能,这次介绍的是两个视频的重叠,可以把两个视频文件合并,也可以把视频和录像结...

  • 补充一下
    nonatomic ( ARC/MRC )
    1.不对set方法加同步锁 。
    2.性能好。
    3.线程不安全。

    atomic ( ARC/MRC )
    1.原子属性就是对生成的 set 方法加互斥锁 (互斥锁 是一种同步锁,

    互斥锁:如果共享数据已经有其他线程加锁了,线程会进入休眠状态等待锁。一旦被访问的资源被解锁,则等待资源的线程会被唤醒。

    自旋锁:如果共享数据已经有其他线程加锁了,线程会以死循环的方式等待锁,一旦被访问的资源被解锁,则等待资源的线程会立即执行。

    自旋锁的效率高于互斥锁 )
    @synchronized(锁对象) 。
    @synchronized(self) { _delegate = delegate;}
    2.需要消耗系统资源 。
    3.互斥锁是利用线程同步实现的 , 意在保证同一时间只有一个线程调用 set 方法 。
    4.其实还有 get 方法 , 要是同时 set 和 get 一起调用还是会有问题的 . 所以即使用了 atomic 修饰 还是不够安全 。

    nonatomic 和 atomic 的介绍和区别
    1. 什么是atomicity(原子性)?
    atomicity(原子性):我把原子性理解成线程对属性的单一执行。
    例如,当两条线程同时执行一个属性的set方法的时候,如果不具有原子性(也就是声明属性时使用了nonatimic),那么就可能出现当A线程正在改写某属性值的时候,B线程也许会突然闯入,把尚未修改好的属性值读取出来。发生这种情况时,线程读取到的属性值肯定不对。
    2. 保证atomicity真的就线程安全了吗?为什么日常声明都用的是nonatomic呢?
    1.保证atomicity并非也是线程安全的,如果需要保证安全,需要跟深层次的线程锁定机制。
    2.使用同步锁在iOS中开销比较大,会给程序带来性能上的问题。
    3. 为什么atomicity也不能保证线程安全?
    例如:当使用atomic时,仍然可能出现线程错误:当线程A进行set操作,这时其他线程的get或者set操作会因为等该操作而等待。当A线程的set操作结束后,B线程进行set操作,然后当A线程需要get操作时,却获得了在B线程的值,这就破坏了线程安全,如果有C线程在A线程get操作之前release了该属性,那么还会导致程序崩溃。所以仅仅使用atomic并不会使得线程安全,我们还是要为线程添加lock来确保线程的安全:smile: