星空网 > 软件开发 > 操作系统

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块中调用另一个对象的方法(它可能已经被锁住并等待之前用到的对象解锁),除非你能保证不会发生死锁,通常情况下只有亲手写其他对象的类的代码才敢确定不会发生死锁。




原标题:JAVA的内存模型(变量的同步)

关键词:JAVA

*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: admin#shaoqun.com (#换成@)。

关于发布《海南自由贸易港交通工具及游艇“零关税”政策海关实施办法(试行)》的公告:https://www.ikjzd.com/articles/139724
英欧自由贸易协定对跨境电商卖家而言意味着什么?:https://www.ikjzd.com/articles/139725
Facebook买号&注册 该选哪个?:https://www.ikjzd.com/articles/139726
墨西哥主要税种解析:https://www.ikjzd.com/articles/139727
数据:印度电商市场规模330亿美元:https://www.ikjzd.com/articles/139728
一个能获得询盘的外贸独立站应该遵循的10条戒律:https://www.ikjzd.com/articles/139729
从园岭新村到大梅沙海滨总站坐什么车:https://www.vstour.cn/a/363191.html
七月份适合去日本旅游吗 7月份去日本哪里好玩:https://www.vstour.cn/a/363192.html
相关文章
我的浏览记录
最新相关资讯
海外公司注册 | 跨境电商服务平台 | 深圳旅行社 | 东南亚物流