您的位置:首页 > 其它

线程安全,线程同步,synchronized

2016-03-15 17:34 92 查看

/**所有内容整理自网上资料
*
什么是线程安全?

如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次运行结果和单线程运行的结果是一样,   而且其他的变量的值也和预期的是一样的,就是线程安全的。
或者说:一个类或者程序所提供的接口对于线程来说是原子操作或者多个线程之间的切换不会导致该接口的执行结果存在二义性,也就是说我   们 不用考虑同步的问题。
线程安全问题都是由全局变量及静态变量引起的。
若每个线程中对全局变量、静态变量只有读操作,而无写操作,一般来说,这个全局变量是线程安全的;若有多个线程同时执行写操作,一   般都需要考虑线程同步,否则就可能影响线程安全。 线程安全就是多线程访问时,采用了加锁机制,当一个线程访问该类的某个数据时,    进行保护,其他线程不能进行访问直到该线程读取完,其他线程才可使用。不会出现数据不一致或者数据污染。
线程不安全就是不提供数据访问保护,有可能出现多个线程先后更改数据造成所得到的数据是脏数据

1、什么场景下使用synchronized关键字?

很显然,数据需要在多个线程中共享访问时,需要对数据进行保护,假如不存在这种场景,那么就不需要考虑多线程保护,否则会影响代码   的运行效率。

2、这些场景下如果不使用synchronized关键字,会有什么后果?

多线程访问冲突,比如数据不一致、数据不正确,对容器操作时容易抛出并发修改异常。

android开发之synchronized的用法

在android开发中synchronized主要有四种用法。第一是在方法声明时使用;第二是在对某一代码块时使用;第三    是对某一对象使
第四是对某一类使用。

1.方法声明时使用

放在范围操作符(public等)之后,返回类型声明(void等)之前.这时,线程获得的是成员锁,即一次只能有一个线程进   入该方法,其他线程   要想在此时调用该方法,只能排队等候,当前线程(就是在synchronized方法内部的线程)执行完    该方法后,别的线程才能进入.

例如:
public synchronized void synMethod() {
//方法体
}
2.对某一代码块使用

synchronized后跟括号,括号里是变量,这样,一次只有一个线程进入该代码块.此时,线程获得的是成员锁.例如:
public int synMethod(int a1){
synchronized(a1) {
//一次只能有一个线程进入
}
}

3.对某一对象使用

synchronized后面括号里是一对象,此时,线程获得的是对象锁.例如:

public void run() {
synchronized (this) {//this对象锁
//do
}

object lock = new object();
public void run() {
synchronized (lock) {//普通对象锁
//do
}

4.对类使用时

synchronized后面括号里是类,此时,线程获得的是对象锁.例如:

synchronized(xxx.class) {//-----这里

}

对于4,如果线程进入,则线程在该类中所有操作不能进行,包括静态变量和静态方法,实际上,对于含有静态方法和静态  变量的代码块的同步  ,我们通常用4来加锁.

以上为synchronized的四种用法。
*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: