线程安全:

在多线程的情况下,不会因为线程之间的操作而导致数据错误。


线程同步:

同一个资源,可能在同一时间被多个线程操作,这样会导致数据错误。这是一个现象,也是一个问题,而研究如何解决
此类问题的相关工作就叫做线程同步。

android中,处理线程同步的手段就是:锁

一般分为公平锁和非公平锁:

synchronized(内部锁,互斥锁):
synchronized是JVM提供的线程同步机制,如果出现问题,JVM能捕获异常,并释放资源,具体实现机制需要查看JVM源码

synchronized的使用特点:

lock接口:
这些实现了lock接口的锁定义是通过java语言进行实现与封装的,具体的实现机制可以通过查看其源代码得知

lock实例加锁和解锁的大概过程:
当一个资源被锁定之后,访问它的线程会被加入等待队列,当

内部锁(互斥锁)ReentrantLock
读写锁

synchronized
1.synchronized作用在方法上:锁对象
2.synchronized作用在代码块:只锁代码块
3.synchronized(this):对象锁
4.synchronized(object):成员锁

总结synchronized:
可以锁对象:synchronized(this) , synchronized(class) , synchronized methods , 此时对象的所有
资源不能被其他线程访问

成员锁:
synchronized(obj){ } , 代码段内的代码不能被同时访问。

对象锁太粗糙

通常情况使用synchronized就够了,资源竞争很激烈的情况下,Synchronized的性能会下降几十倍,才会使用
ReetrantLock来完成复杂的业务需求。(不公平锁)

使用java封装的锁对象可以更灵活的满足业务需求,比如可以设定锁的等待时间,公平性等等,而使用Synchronized
则只能使用同步监视器的三个方法来操作线程


线程通讯:

synchronized作为对象锁时候,通过this,可以调用三个方法在线程之间通讯
synchronized作为成员所时候,通过(obj),调用三个方法,其中被锁的东西就叫做同步监视器。(this,obj)

wait:当前线程进入等待状态,直到其他线程调用该同步监视器的notity方法或者notityall方法来唤醒.
调用wait就以为着释放同步监视器

notify:唤醒在此同步监视器上等待的单个线程。如果所有线程都在此同步监视器上等待,则会随机选择唤醒其中一个线程。
只有当前线程放弃对该同步监视器的锁定后(用wait方法),才可以执行被唤醒的线程

notityAll: 唤醒在此同步监视器上等待的所有线程。只有当前线程放弃对该同步监视器的锁定后,才能执行唤醒的线程。


线程模型:
消息循环
消息队列
handler
Thread
UI Thread

android的线程模型:
UI线程有一个消息队列,一个消息循环,一个Handler.

一般建立的后台线程对象就是一个一次性完成工作的任务.

如何建立他们之间的联系?

一般情况下,启动一个非UI线程用于处理耗时工作之后,需要一个机制用于通知UI线程,工作做好了,
这个机制就是一个Message。
当后台线程工作结束之后,向欲通知的线程发送一个Message,用来通知这个目标线程说:“我已经工作完了”,而这个
Message怎么发过去呢?通过Handler对象。 想给哪个线程发送Message就给该线程的Handler发送Message.
(前提是目标线程有处理消息的能力)
综上:

当后台线程完成工作之后,会通过UI线程的Handler对象发送一个Message到UI线程的消息队列中,UI线程的消息循环
就会从消息队列中取出此Message,并且处理此Message,做爱做的事。

对于一个后台线程:

如果想让该 线程具有消息队列和消息循环,需要在线程中首先调用Looper.prepare()来创建消息队列,然后调用Looper.loop()进入消息循环。 如下例所示:
class LooperThread extends Thread {
public Handler mHandler;

public void run() {
Looper.prepare();

mHandler = new Handler() {
public void handleMessage(Message msg) {
// process incoming messages here
}
};

Looper.loop();
}
}
这样你的线程就具有了消息处理机制了,在Handler中进行消息处理。

[Android学习笔记]Android中多线程开发的一些概念的更多相关文章

  1. Android学习笔记—Windows下NDK开发简单示例

    该示例假设Android开发环境已经搭建完成,NDK也配置成功: 1.在Eclipse上新建Android工程,名称为ndkdemo.修改res\layout\activity_main.xml &l ...

  2. Android学习笔记(一)开发环境搭建

    Android开发环境搭建 安装JDK 1.如果你还没有JDK的话,可以去这里http://www.oracle.com/technetwork/java/index.html ,接下来的工作就是安装 ...

  3. [Android学习笔记]ListView中含有Button导致无法响应onItemClick回调的解决办法

    转自:http://www.cnblogs.com/eyu8874521/archive/2012/10/17/2727882.html 问题描述: 当ListView的Item中的控件只是一些展示类 ...

  4. Android学习笔记_49_Android中自定义属性(attrs.xml,TypedArray的使用)

    做Android布局是件很享受的事,这得益于他良好的xml方式.使用xml可以快速有效的为软件定义界面.可是有时候我们总感觉官方定义的一些基本组件不够用,自定义组件就不可避免了.那么如何才能做到像官方 ...

  5. 2.1多线程(java学习笔记) java中多线程的实现(附静态代理模式)

    一.多线程 首先我们要清楚程序.进程.线程的关系. 首先进程从属于程序,线程从属于进程. 程序指计算机执行操作或任务的指令集合,是一个静态的概念. 但我们实际运行程序时,并发程序因为相互制约,具有“执 ...

  6. Android 学习笔记之使用多线程实现断点下载...

    PS:莫名其妙的迷茫... 学习内容: 1.使用多线程实现文件下载...   多线程下载是加快下载速度的一种方式..通过开启多个线程去执行一个任务..可以使任务的执行速度变快..多线程的任务下载时常都 ...

  7. android学习笔记----JNI中的c控制java

    面向对象的底层实现 java作为面向对象高级语言,可对现实世界进行建模.和面向过程不同的是面向对象软件的编写不是流程的堆积,而是对业务逻辑的多视角分解和分类.其过程大致为:      1).将知识分解 ...

  8. Android学习笔记----TimerTask中显示Toast的问题

    今天想在TimerTask的run函数中调用Toast显示一下提示信息,却总是导致程序崩溃.可是try语句块却又无法捕获到异常,代码如下: ...... Timer timer = new Timer ...

  9. Android学习笔记----Java中的字符串比较

    用习惯了C#.C++,在做字符串比较时想当然地使用如下语句: string str1 = "abcd", str2 = "abcd"; if(str1==str ...

随机推荐

  1. 【Java Web】使用URLRewrite实现网站伪静态

    大部分搜索引擎都会优先考虑收录静态的HTML页面,而不是动态的*.jsp.*.php页面.但实际上绝大部分网站都是动态的,不可能全部是静态的HTML页面,因此互联网上大部分网站都会考虑伪静态——就是将 ...

  2. Android TextView(同时显示图片+文字)

    见上图:需要图片和文字 在一起 之前的做法是用两个控件组成 <LinearLayout> <ImageView /> <TextView /> </Linea ...

  3. Introduction to the Build Lifecycle

    Introduction to the Build Lifecycle Table Of Contents Build Lifecycle Basics Setting Up Your Project ...

  4. POJ 3986 Math teacher's homework

    题目 给出\(n,m_1,m_2,...,m_n\),求\(x_1 xor x_2 xor ... xor x_n=k (0 \leq x_i \leq m_i)\)的解的数量.二进制位数小于\(32 ...

  5. Java 螺纹第三版 第三章数据同步 读书笔记

    多线程间共享数据问题 一.Synchronizedkeyword      atomic一词与"原子"无关,它以前被觉得是物质的最小的单元,不能再被拆解成更小的部分.      当 ...

  6. WCF技术剖析之二十: 服务在WCF体系中是如何被描述的?

    原文:WCF技术剖析之二十: 服务在WCF体系中是如何被描述的? 任何一个程序都需要运行于一个确定的进程中,进程是一个容器,其中包含程序实例运行所需的资源.同理,一个WCF服务的监听与执行同样需要通过 ...

  7. java layout 表格项增加、删除、修改

    实现的内容为:点击表格某项,再点击删除钮,可实现删除点击表格某项,再点击编辑按钮,可实现内容改变点击添加按钮,可实现向表格中添加内容 总结:总的来说中间遇到了很多困难,但是都一步步的解决了. pack ...

  8. asp.net2.0安全性(3)--验证与授权--转载来自车老师

    "验证"与"授权"是对网页资源安全管理的两道门. 验证(Authentication):检查用户是否是合法的用户.就像是网站大门口的保卫,服责验证使用的用户名和 ...

  9. sql: sybase 和 oracle 比较

    1. sybase 和 oracle 比较 http://blog.itpub.net/14067/viewspace-1030014/ Oracle采用多线索多进程体系结构 Sybase采用单进程多 ...

  10. QNX简介<转载>

     QNX QNX是由QNX软件系统有限公司开发的实时操作系统. http://blog.csdn.net/happyhell/article/details/7087199 基本特征 * QNX是一个 ...