不可变和线程安全
大多数线程安全问题,来源自对可变对象的并发读写。以下是一个在java中的典型并发问题代码片段:
如果多个线程调用同一个SomeExampleClass对象的getThisOrThat方法时,就会出现一个典型的竞争条件。当第二个线调用此方法并尝试读取mCount变量时,第一个线程此时可能正在执行mCount++操作,因此,我们就无法确定第二个线程将会读取到什么值。这个问题的根本原因,就是多个线程尝试读写了一个可变对象mCounter。一般来说,当我们遇到将计算分配到各个不同线程中去计算的问题时,竞争条件是最常见的问题。
竞争条件的存在,导致了在多线程中处理UI问题变得特别复杂。在Android中,view对象都都是富有状态并且状态可被改变。例如TextView,在保持当前文本的同时,需要给开发者暴露setText()的方法,允许改变其状态。这意味着在Android系统中,如果UI框架打算在其他线程中执行耗时计算(如layout)时,框架就必须解决在耗时计算的同时,对象的状态可能被其他线程修改的问题。
more >>