Android线程安全问题总结

作者: 牧童遥指2000 | 来源:发表于2017-02-17 15:57 被阅读613次

线程安全的定义

线程安全:如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的,或者说:一个类或者程序所提供的接口对于线程来说是原子操作或者多个线程之间的切换不会导致该接口的执行结果存在二义性,也就是说我们不用考虑同步的问题 。

Android的单线程模型

当一个程序第一次启动的时候,Android会启动一个LINUX进程和一个主线程。默认的情况下,所有该程序的组件都将在该进程和线程中运行 。主线程(Main Thread)主要负责处理与UI相关的事件,如:用户的按键事件,用户接触屏幕的事件以及屏幕绘图事 件,并把相关的事件分发到对应的组件进行处理。所以主线程通常又被叫做UI线程。

系统不会为每个组件单独创建线程,在同一个进程里的UI组件都会在UI线程里实例化,系统对每一个组件的调用都从UI线程分发出去。结果就是,响应系统回调的方法(比如响应用户动作的onKeyDown()和各种生命周期回调)永远都是在UI线程里运行。

UI线程才能与Android UI工具包中的组件进行交互,在开发Android应用时必须遵守单线程模型的原则:

1. Android UI操作并不是线程安全的并且这些操作必须在UI线程中执行。

2.不要阻塞UI线程。

为什么说Android UI不是线程安全的?

android UI 中提供invalidate()来更新界面,而invalidate()方法是线程不安全。
Android提供了Invalidate方法实现界面刷新,但是Invalidate不能直接在非UI主线程中调用,因为他是违背了单线程模型:Android UI操作并不是线程安全的,并且这些操作必须在UI线程中调用。例如:在非UI线程中调用invalidate会导致线程不安全,也就是说可能在非UI线程中刷新界面的时候,UI线程(或者其他非UI线程)也在刷新界面,这样就导致多个界面刷新的操作不能同步,导致线程不安全

相关文章

  • Android线程安全问题总结

    线程安全的定义 线程安全:如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次...

  • 2020-12-31String StringBuffer St

    面试经常会问到这个问题。就做个总结吧。 线程安全问题:StringBuffer是线程安全得 为什么线程安全 因为它...

  • Java线程安全

    线程安全问题的概述 线程安全问题的代码实现 线程安全问题产生的原理 解决线程安全问题_同步代码块 同步代码块:sy...

  • Android消息机制(六) 总结

    参考Android线程的正确使用姿势Android性能优化典范之多线程篇 Android多线程编程的总结Andro...

  • 7.2 Handler消息传递机制

    简介:handler消息处理者,用来发生和处理消息,用于解决线程安全问题; 线程安全问题:多线程导致线程安全问题,...

  • 线程池创建和相关知识

    线程池创建(单例):Android线程池得要这么用 - 简书 线程池相关知识:Android开发之线程池使用总结 ...

  • 线程的基本语法

    线程同步[解决线程安全问题] 解决线程安全问题 线程同步方式一:同步代码 语法基本 synchronized (同...

  • 五 异常与多线程——第三节 线程同步机制

    1、线程安全问题的概述 多线程访问了共享的数据,就会产生线程安全问题 2、线程安全问题的代码实现 输出:会出现重复...

  • 进程、线程、多线程区别

    原文:Android面试总结:进程、线程、多线程相关总结[https://cloud.tencent.com/de...

  • Android多线程界面更新方法的总结

    Android多线程界面更新的方法总结 Android多线程与界面交互的方法 Activity.runOnUiTh...

网友评论

  • android_coder:是不是应该这么理解:ui线程之所以设计成线程不安全,原因在性能考虑,如果每个线程都能直接操作UI元素,那么界面显示就很乱套,不是我们期望的,虽然可以使用加锁来解决线程安全的问题,但是锁会导致性能的问题,android规定activityThread中的各种动作都必须在指定时间内完成,因此UI线程设计成了线程不安全,子线程可以通过消息的机制去更新UI界面
  • ee314b587c8b:没猜错的话,这是google developer里面的原话。总之一句话:ActivityThread所有的指令要在指定时间之内完成,否则就会阻塞UI线程,与用户及系统的交互,核心在于Looper的死循环方法loop(),loop会不停地从mq中取msg,然后交给handler去处理。
  • 澎湃的犯二激情:系统对每一个组件的调用都从UI线程分发出去,并不会导致 响应系统回调的方法必须在UI线程里运行,如果系统就乐意在非UI线程进行回调呢?这应该是系统就这么规定的,而不是前因后果的关系。
  • Jimmy_gjf:多线程读写数据的时候坑比较多
    牧童遥指2000:@Jimmy_gjf 多进程很暴力啊
    Jimmy_gjf:@fengsehng 我一直是这么认为的,直到我遇到了多进程。。。
    牧童遥指2000:@Jimmy_gjf 多线程整个很坑
  • 牧童遥指2000:关于Android的多线程更多的是不要阻塞主线程

本文标题:Android线程安全问题总结

本文链接:https://www.haomeiwen.com/subject/ezklwttx.html