Java原子性线程
顾名思义,作为原子是微观学的不受外界影响,指在一个操作是不可中断的,一旦操作开始,就不会受到其它线程干扰。
举个例子:
比如,对于一个全局变量,String s ; 两个线程同时对它赋值,线程A给他赋值 You love me ,而B线程给它赋值 I love you。那不管这两个线程以何种方式调动工作,s 的值要么是 “I love you"要么就是"You love me”。线程A和B之间是没有干扰的。程序一旦执行就不可以中断。
注意:对于32位系统来说,long 型的数据的读写不是原子性的,因为long有64位,也就是在32位系统下如果有两个线程同时对long型数据进行该写,是受到干扰的。
public class MultiThreadLong {
public static long t =0;
public static class ChangeT implements Runnable {
private long to;
public ChangeT(long to){
this.to = to;
}
public void run(){
while(true){
MultiThreadLong.t = to;
Thread.yield(); // 对调度程序的一个暗示,即当前线程愿意产生当前使用的处理器。
}
}
}
public static class ReadT implements Runnable {
public void run(){
int i =0;
boolean f = true;
while(f){
long tmp = MultiThreadLong.t;
if(tmp != 111L&&tmp!=222L&& tmp!=333L&&tmp!=444L) {
System.out.println(tmp);
i++;
}
Thread.yield();
if(i>100)
f = false;
}
}
}
public static void main(String [] args){
new Thread(new ChangeT(111L)).start();
new Thread(new ChangeT(222L)).start();
new Thread(new ChangeT(333L)).start();
new Thread(new ChangeT(444L)).start();
new Thread(new ReadT()).start();
}
}
/*
代码分析:上序有四条线程Long线程,分别传入long型数据进行改写,
用 if 语句做判断进行原子判断输出。
在64 java虚拟机机条件运行是没有输出的。
但是在32位条件下,是有乱码整型数据输出的。
切记要在32位Java机虚拟机条件下运行
*/