在目标C中使用primefaces属性:任何副作用?

我理解atomic的含义在primefaces和非primefaces属性之间有什么区别? ,但我想知道的是:

问:除了性能问题之外,在所有地方使用primefaces属性是否有任何副作用?

似乎答案是否定的,因为现在iPhone的性能相当快。 那么为什么这么多人还在使用non-atomic

即使是atomic也不保证线程安全,但它仍然比没有好,对吧?

即使是primefaces也不保证线程安全,但它仍然比没有好,对吧?

错了 。 编写了一些非常复杂的并发程序后,我建议完全相反 。 你应该保留atomic用于真正有意义的使用 – 你可能不会完全理解这一点,直到你编写并发程序而不使用atomic 。 如果我正在编写multithreading程序,我不希望屏蔽编程错误(例如竞争条件)。 我希望并发问题响亮而明显。 这样,它们更容易识别,重现和纠正。

一些线程安全性比没有更好的信念是有缺陷的。 该程序是线程安全的,或者不是。 使用atomic可以使程序的这些方面更能抵抗与并发相关的问题,但这并不会给你带来太大的影响。 当然,可能会有更少的崩溃,但程序仍然毫无疑问是不正确的,它仍将以神秘的方式爆炸。 我的建议:如果你不打算花时间学习和编写正确的并发程序,只需保持它们的单线程(如果听起来有点苛刻:它并不意味着苛刻 – 它会让你免于很多麻烦)。 multithreading和并发是一个庞大而复杂的主题 – 学习在许多领域中编写真正正确,长期存在的程序需要很长时间。

当然,在某些情况下, atomic可以用来实现线程安全 – 但是使每个访问primefaces都保证线程安全。 同样,非常不寻常(统计学上)单独的atomic属性会使类真正的线程安全,特别是随着类的复杂性的增加; 更有可能的是,只有一个具有5个ivars的类,使用一个ivar的类是真正安全的。 atomic属性是我很少使用的一个特性(同样,一些非常大的代码库和并发程序)。 如果primefaces能使类真正的线程安全,它实际上是一个极端的案例。

性能和执行复杂性是避免它们的主要原因。 与非primefaces访问相比,以及访问变量的频率和简单性,使用primefaces非常快。 也就是说,primefaces访问相对于它们执行的任务引入了大量的执行复杂性。

自旋锁是实现primefaces属性的一种方式。 那么,你是否想要一个同步原语,如自旋锁或互斥锁,隐含地围绕每个 get和set,知道它不能保证线程安全吗? 我当然不会! 在您的实现中使每个属性访问primefaces可能会消耗大量的CPU时间。 只有当你有明确的理由时才应该使用它(也是由dasblinkenlicht + 1提到)。 实现细节:一些访问不需要自旋锁来维护atomic保证; 它取决于几个方面,例如体系结构和变量的大小。

那么回答你的问题“任何副作用?” 在TL中; DR格式:性能是你注意到的主要原因,而primefaces保证的适用性以及它对你有用的在你的抽象层次上是非常狭窄的(经常被误解),它掩盖了真正的错误。

你不应该为你不使用的东西买单。 与插入式计算机的CPU循环时间成本不同,移动设备上的CPU周期会花费您的时间和电池使用时间。 如果您的应用程序是单线程的,则没有理由使用atomic ,因为锁定和解锁操作会浪费时间和电池。 电池比时间更重要:虽然与额外操作相关的延迟可能对最终用户不可见,但是花费的周期将减少移动设备在一次充电后可以工作的时间,这是一个很大的措施。用户认为非常重要。