Netty权威指南关于 volatile关键字的错误
Netty权威指南关于 volatile关键字的错误
wenhaoran 发表于1年前
Netty权威指南关于 volatile关键字的错误
  • 发表于 1年前
  • 阅读 147
  • 收藏 6
  • 点赞 1
  • 评论 5

腾讯云 新注册用户 域名抢购1元起>>>   

原文截图:

import java.util.concurrent.TimeUnit;

public class ThreadStopExample {
	private static volatile boolean stop;
//	private static boolean stop;
	public static void main(String[] args) throws InterruptedException {
		Thread workThread = new Thread(new Runnable() {
			@Override
			public void run() {
				int i =0 ;
				while(!stop){
					i++;
					try {
						TimeUnit.SECONDS.sleep(1);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				}
			}
		});
		workThread.start();
		TimeUnit.SECONDS.sleep(3);
		stop = true;
	}
}

按照书中的例子原封不动的敲下来

反编译后的截图:

并不像书中的那样 if(!stop) while(true).......[备注:我使用的是JDK7]

 

原书截图

如下

 

希望作者李林峰大哥能给你读者一个解释(这里绝没有诋毁的意思 只是对技术的‘吹毛求疵’,林峰大哥也是了不起的- 华为的BME平台的项目经理,非常喜欢里面的 bme 标签库 )

无意之间 我写例外一个程序发现了能很好说明 volatile的用法例子 费话不多说先上
                


public class Increate2 {
	volatile int  i = 0;
	
	volatile boolean  finished;
	public synchronized void increate(){
		i++;
	}
	public synchronized int current(){
		return i;
	}
	
	public void setFinished(boolean b){
		this.finished = b;
	}
	
	public static void main(String[] args) {
		for (int j = 0; j < 10; j++) {
			final Increate2 increate = new Increate2();
			for (int i = 0; i < 2000; i++) {
				new Thread(new Runnable() {
					@Override
					public void run() {
							increate.increate();
							if(Thread.currentThread().getName().equals("1999")){
								System.out.println("Finished");
								increate.setFinished(true);
//								System.out.println(increate.current());
							}
					}
				},""+i).start();
			}
			
//			while(increate.finished){
//				System.out.println(increate.current());
//				break;
//			}
			
			for (;;) {
				if(increate.finished){
					System.out.println(increate.current());
					break;
				}
			}
		
		}
		
	}

}

做这个实验我也是费了一番周折

1、先把代码运行一下 看结果 看反编译文件

2、把finished volatile修饰去掉 再运行 看结果 看反编译文件

3、把 for(;;)注释掉 把while 放开 运行 看结果 看反编译文件

4、把 finished volatile修饰增加 再运行 看结果 看反编译文件

时间紧 运行结果我也不贴出来了 动动手试试看 你会发现一些奥秘~~~

 

 

 

标签: java volatile
共有 人打赏支持
粉丝 8
博文 6
码字总数 2685
评论 (5)
lotsbug
你确定是原封不动敲下来的?原文可没有volatile ,有volatile 修饰当然就是你那个效果了。书上说的并没有什么问题吧
wenhaoran

引用来自“lotsbug”的评论

你确定是原封不动敲下来的?原文可没有volatile ,有volatile 修饰当然就是你那个效果了。书上说的并没有什么问题吧
看到你的回复 我火速去看了书 核查了一下 我没有看错 原书的截图已经更新到微博上了
lotsbug
你把原文那行注释了,我也是想当然了,试了一下,这个例子确实加不加volatile 都没什么影响(JDK8)……
wenhaoran

引用来自“lotsbug”的评论

你把原文那行注释了,我也是想当然了,试了一下,这个例子确实加不加volatile 都没什么影响(JDK8)……
所以我也怀疑是不是跟我的jdk版本 操作系统 有关
SKYOFKING
我记得这是线程间可见性的问题
×
wenhaoran
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: