如何理解volatile变量使用条件? 如何理解截图中说的该变量不会与其他状态变量一起纳入不变性条件什么叫不变性条件谁能构建一个例子说明一下这个场景下使用volatile会发生什么错误 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 volitile的含义就是被修饰的变量是可变的,所以这个修饰不能和final一起用的原因。而这个可变性暗示着变量发生变化可以被多个使用该变量的线程感知。这样在很多时候可以降低线程同步的代价。这个举例子不太好用:public class VolatileApplication { public static void main(String[] args) throws Exception { MyRunnable r = new MyRunnable(); Thread t = new Thread(r); t.start(); r.setEnd(true);//line 9 t.join();//line 10 System.out.println("Terminate the main Thread.");//line 11 }}class MyRunnable implements Runnable { private boolean end = false;//line 17 @Override public void run() { while (!end) {// line 22 try { Thread.sleep(100); } catch (InterruptedException e) { Thread.currentThread().interrupt(); } System.out.println(Thread.currentThread() + " is going on!"); } } public void setEnd(boolean end) { this.end = end; //line 32 }}以上代码启动了一个任务MyRunnable,line 22是这个线程的终止条件,这个任务提供了一个修改终止条件的方法setEnd(boolean end),这个任务将会运行在一个新线程中,line 9主线程调用了修改方法;用来修改循环的终结条件,但是如果不使用volatile关键字的话,那么这个设置有可能不被运行run方法的线程发现,这个发现过程是需要线程在主存中得到,如果主存没有被刷新那么这个就将导致设置效果出问题。volatile就是强制将改变刷新到主存,保证了线程通信的可靠性。运行以上代码,基本是没有问题的,因为在这样一个示例系统中,很难导致问题出现,这个问题出现的概率一般极小,但是一旦发生就可能引发灾难性的后果。 请教怎么读股票的内存地址? 将文件为UTF-8格式转化为ANSI格式,仍然乱码 急 tomcat 连接池异常 请大伙帮忙看看 菜鸟问题:这两种异常写法有什么区别 出错问题:需要 ".class" 请 高手帮我看看 问题在哪儿????????? 小弟请教? 怎么判断2个字符串相等啊? 万元高薪诚聘 jna.jar软件包该放在什么地方? 求助求助 如何控制字符串的接收内容,求指导
这个举例子不太好用:
public class VolatileApplication {
public static void main(String[] args) throws Exception { MyRunnable r = new MyRunnable();
Thread t = new Thread(r);
t.start();
r.setEnd(true);//line 9
t.join();//line 10
System.out.println("Terminate the main Thread.");//line 11
}}class MyRunnable implements Runnable {
private boolean end = false;//line 17 @Override
public void run() {
while (!end) {// line 22
try {
Thread.sleep(100);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
System.out.println(Thread.currentThread() + " is going on!");
}
} public void setEnd(boolean end) {
this.end = end; //line 32
}
}
以上代码启动了一个任务MyRunnable,line 22是这个线程的终止条件,这个任务提供了一个修改终止条件的方法setEnd(boolean end),这个任务将会运行在一个新线程中,line 9主线程调用了修改方法;用来修改循环的终结条件,但是如果不使用volatile关键字的话,那么这个设置有可能不被运行run方法的线程发现,这个发现过程是需要线程在主存中得到,如果主存没有被刷新那么这个就将导致设置效果出问题。volatile就是强制将改变刷新到主存,保证了线程通信的可靠性。
运行以上代码,基本是没有问题的,因为在这样一个示例系统中,很难导致问题出现,这个问题出现的概率一般极小,但是一旦发生就可能引发灾难性的后果。