JAVA的内存模型(变量的同步)
作者:李培能 发布时间:[ 2016/9/29 14:13:03 ] 推荐标签:Java 测试开发技术 内存
这里讲述的是JAVA的内存模型(变量的同步)的文章,具体方法请看介绍
一个线程中变量的修改可能不会立即对其他线程可见,事实上也许永远不可见。
在代码一中,如果一个线程调用了MyClass.loop(),将来的某个时间点,另一个线程调用了MyClass.setValue(100),第一个线程可能仍然不会终止,可能永远循环下去
代码一:
public class MyClass{
private static final String TAG="MyClass";
private static int mValue=0;
public static void setValue(int n){
mValue=n;
}
public static void loop(){
int value;
while(value!=100){
try{
Log.i(TAG,"Value is "+value);
Thread.sleep(1000);
}catch(Exception e){
}
}
}
}
上面的问题有两种解决办法:
一是使用synchronized关键字
public class MyClass{
private static final String TAG="MyClass";
private static int mValue=0;
public static synchronized void setValue(int n){
mValue=n;
}
public static synchronized int getValue(){
return mValue;
}
public static void loop(){
int value;
while((value=getValue())!=100){
try{
Log.i(TAG,"Value is "+value);
Thread.sleep(1000);
}catch(Exception e){
}
}
}
}
二是使用volatile关键字
public class MyClass{
private static final String TAG="MyClass";
private static volatile int mValue=0;//添加volatile关键字
public static void setValue(int n){
mValue=n;//如果是mValue+=n,因为不是原子操作,还得使用synchronized
}
public static void loop(){
int value;
while(value!=100){
try{
Log.i(TAG,"Value is "+value);
Thread.sleep(1000);
}catch(Exception e){
}
}
}
}
value++不是原子的,value=1是原子的。volatile关键字只可以解决变量声明是原子的那些并发问题,如果变量不是原子的必须使用synchronized关键字
不要在synchronized块中调用另一个对象的方法(它可能已经被锁住并等待之前用到的对象解锁),除非你能保证不会发生死锁,通常情况下只有亲手写其他对象的类的代码才敢确定不会发生死锁。
相关推荐
更新发布
功能测试和接口测试的区别
2023/3/23 14:23:39如何写好测试用例文档
2023/3/22 16:17:39常用的选择回归测试的方式有哪些?
2022/6/14 16:14:27测试流程中需要重点把关几个过程?
2021/10/18 15:37:44性能测试的七种方法
2021/9/17 15:19:29全链路压测优化思路
2021/9/14 15:42:25性能测试流程浅谈
2021/5/28 17:25:47常见的APP性能测试指标
2021/5/8 17:01:11