zoukankan      html  css  js  c++  java
  • 原子和非原子属性

    一、原子和非原子属性

    1. OC在定义属性时有nonatomic和atomic两种选择:

    atomic:原子属性,为setter方法加锁(默认就是atomic);
    nonatomic:非原子属性,不会为setter方法加锁。


    2. nonatomic和atomic的对比
    atomic:线程安全,需要消耗大量的资源;
    nonatomic:非线程安全,适合内存小的移动设备。

    3. iOS开发的建议
    所有属性都声明为nonatomic。
    尽量避免多线程抢夺同一块资源。
    尽量将加锁、资源抢夺的业务逻辑交给服务器端处理,减小移动客户端的压力。

    二、互斥锁&自旋锁


    互斥锁:
    如果发现其他线程正在执行锁定代码,线程会进入休眠(就绪状态),等其它线程时间片到打开锁后,线程会被唤醒(执行)。

    自旋锁:
    如果发现有其它线程正在锁定代码,线程会用死循方式,一直等待锁定的代码执行完成,自旋锁更适合执行不耗时的代码。


    //nonatomic 非原子性,getter setter 方法都不加锁,多个线程都可以访问

    //atomic 原子性,内部有一把锁,锁的是赋值的setter方法,读取操作没有上锁

    //自旋锁

    @property(atomic,strong) NSObject *obj2;

    //模拟原子属性

    - (void)setObj2:(NSObject *)obj2{

        //加锁

        @synchronized(self) {

            _obj2 = obj2;

        }

    }

  • 相关阅读:
    叉积
    Linux IO模型
    uva10201-dp
    如何在Java内使用Protobuf
    uva10651-记忆化搜索
    ZK的几个常用方式
    uva10304-最优二叉搜索树
    uva590-DP-Always on the run
    Git神操作
    在容器内运行JVM时内存的问题
  • 原文地址:https://www.cnblogs.com/leikun1113/p/5658330.html
Copyright © 2011-2022 走看看