您的位置:首页 > 编程语言 > Python开发

python 文件内容对比操作

2012-09-01 14:53 453 查看
每个线程都有自己的空间去暂存数据

当有一份数据在A,B线程之间共享

那么在A线程中改变了B是不会马上知道的

example

 

/**
*	共享对象
*	多个对象在没有同步的情况下会发生可见性的错误
*/
public class SharingObjects1 {
private static boolean ready;
private static int number;

private static class ReaderThread extends Thread{
@Override
public void run(){
while(!ready){
Thread.yield();
System.out.println(number);
}
System.out.println("thread "+Thread.currentThread().getId()+" over");
}

public static void main(String[] args) {
new ReaderThread().start();
number = 42;
ready = true;
System.out.println("thread "+Thread.currentThread().getId()+" over");
}
}
}

 
输出:

0
0
0
0
thread 11 over
thread 1 over

同理

 

package com.taobao.threadlearning.simple;

public class SharingObjects2 {
class SynchronizedInteger{
private int value;
public int getValue() {		 	return value;		}
public void setValue(int value) {	this.value = value;		}
}

}


 这段代码也是线程不安全的,当A线程已经调用过set方法,在A线程本地存储的变量写回到公共空间前B线程依然可能通过get方法获得已经过期的数据。

 

如何解决?

两种方式

A   同步

B   Volatile关键字

当一个域声明为volatile类型后,它确保对一个变量的更新以可预见的方式告知其他的线程。volatile变量不会缓存在寄存器或者缓存在在对其他处理器隐藏的地方。所以,读取一个volitile类型的时,总会返回由某一线程所写入的最新值。

 

当然volatile只能保证可见性,而加锁可以保证可见性和原子性。

以下代码

 

volatile int i;
public int IncAndGet(){
i++;
return i;
}

 任然不能保证在多线程下正常工作,原因 原子性

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