文档章节

Netty权威指南关于 volatile关键字的错误

wenhaoran
 wenhaoran
发布于 2016/11/23 16:13
字数 426
阅读 150
收藏 6
点赞 1
评论 5

原文截图:

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修饰增加 再运行 看结果 看反编译文件

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

 

 

 

© 著作权归作者所有

共有 人打赏支持
wenhaoran
粉丝 9
博文 6
码字总数 2685
作品 0
深圳
后端工程师
加载中

评论(5)

SKYOFKING
SKYOFKING
我记得这是线程间可见性的问题
wenhaoran
wenhaoran

引用来自“lotsbug”的评论

你把原文那行注释了,我也是想当然了,试了一下,这个例子确实加不加volatile 都没什么影响(JDK8)……
所以我也怀疑是不是跟我的jdk版本 操作系统 有关
l
lotsbug
你把原文那行注释了,我也是想当然了,试了一下,这个例子确实加不加volatile 都没什么影响(JDK8)……
wenhaoran
wenhaoran

引用来自“lotsbug”的评论

你确定是原封不动敲下来的?原文可没有volatile ,有volatile 修饰当然就是你那个效果了。书上说的并没有什么问题吧
看到你的回复 我火速去看了书 核查了一下 我没有看错 原书的截图已经更新到微博上了
l
lotsbug
你确定是原封不动敲下来的?原文可没有volatile ,有volatile 修饰当然就是你那个效果了。书上说的并没有什么问题吧
OSC 第 50 期高手问答 -- Netty 开发的问题

OSCHINA 本期高手问答(7月7日-7月13日)我们请来了 @Nettying (李林锋)为大家解答关于Netty方面的问题。 @Nettying 李林锋:Netty中国推广者,现华为技术有限公司平台中间件架构与设计部设计...

阿娇OSC ⋅ 2014/07/07 ⋅ 65

ProtoBuf Window 使用 Protoc.exe 生成文件路径问题

Window操作系统下 参考《Netty权威指南第二版》中对ProtoBuf的讲解部分,用Protoc.exe 生成java文件会报Missing input file 错误。 解决办法: cmd 这样写: > protoc ./SubscribeReq.proto ...

@林文龙 ⋅ 06/07 ⋅ 0

【并发编程】volatile非原子的特性

一、前言: 上一遍博客中已经提及了volatile关键字虽然拥有了多个线程之间的可见性,但是却不具备同步性(也就是原子性),可以算的上是线程同步的轻量级实现,性能要比synchronized强很多,...

qq_26545305 ⋅ 01/25 ⋅ 0

【多线程】volatile非原子的特性

一、前言: 上一遍博客中已经提及了volatile关键字虽然拥有了多个线程之间的可见性,但是却不具备同步性(也就是原子性),可以算的上是线程同步的轻量级实现,性能要比synchronized强很多,...

qq_26545305 ⋅ 01/25 ⋅ 0

书籍推荐:《Netty权威指南》

《Netty权威指南》是异步非阻塞通信领域的经典之作,基于最新版本Netty 5.0编写,是国内首本深入介绍Netty原理和架构的技术书籍,也是作者多年实战经验的总结和浓缩。在理论方面,讲解了Net...

ddddd8 ⋅ 2017/12/05 ⋅ 0

Netty权威指南中的一个例子无法实现

大家好,我最近在学netty,参考资料是netty权威指南,自己在运行第七章序列化服务端客户端例子时得不到书中的结果,代码和书中一样,不知道哪里出了问题,求网友指点,所有代码如下,运行结果...

王雄兵在路上 ⋅ 2016/12/01 ⋅ 0

OSC 第 113 期高手问答 -- 分布式服务框架

OSCHINA 本期高手问答(3月22日-3月28日) 我们请来了 @Nettying (李林锋)为大家解答关于分布式服务框架方面的问题。 @Nettying(李林锋),现任华为PaaS平台架构师,8年Java NIO通信框架、平...

催呀催呀 ⋅ 2016/03/22 ⋅ 62

《JavaScript权威指南》笔记(一)

《JavaScript权威指南》真是名符其实的好书!真遗憾初学JavaScript时没有立即读这本书,甚为遗憾。不过小有经验之后读来更是有如醍醐灌顶一般,许多之前遇到的奇怪问题和读不懂的代码都迎刃而...

小微 ⋅ 2012/08/28 ⋅ 1

双11Java程序员书单推荐

Java 《Java核心技术卷I》 《Java核心技术卷II》 《Java编程思想》 《Java并发编程实战》 《Effective Java》 《Java8实战》 《Java8函数式编程思维》 《深入理解Java虚拟机》 《Java性能权威...

黄步欢 ⋅ 2017/11/04 ⋅ 0

Netty权威指南 第二版 书中最新代码下载地址谁能提供一下

Netty权威指南 第二版 书中最新代码下载地址谁能提供一下,比如第七章的MessagePack 开发的代码

miaohaifeng ⋅ 2015/09/23 ⋅ 2

没有更多内容

加载失败,请刷新页面

加载更多

下一页

SpringCloud 微服务 (六) 服务通信 RestTemplate

壹 通信的方式主要有两种,Http 和 RPC SpringCloud使用的是Http方式通信, Dubbo的通信方式是RPC 记录学习SpringCloud的restful方式: RestTemplate (本篇)、Feign 贰 RestTemplate 类似 Http...

___大侠 ⋅ 11分钟前 ⋅ 0

React创建组件的三种方式

1.无状态函数式组建 无状态函数式组件,也就是你无法使用State,也无法使用组件的生命周期方法,这就决定了函数组件都是展示性组件,接收Props,渲染DOM,而不关注其他逻辑。 无状态函数式组...

kimyeongnam ⋅ 17分钟前 ⋅ 0

react 判断实例类型

今天在写组件的时候想通过判断内部子元素不同而在父元素上应用不同的class,于是首先要解决的就是如何判断子元素的类型。 这里附上一个讲的很全面的文章: https://www.cnblogs.com/onepixel...

球球 ⋅ 24分钟前 ⋅ 0

Centos7备份数据到百度网盘

一、关于 有时候我们需要进行数据备份,如果能自动将数据备份到百度网盘,那将会非常方便。百度网盘有较大的存储空间,而且不怕数据丢失,安全可靠。下面简单的总结一下如何使用 bypy 实现百...

zctzl ⋅ 38分钟前 ⋅ 0

开启远程SSH

SSH默认没有开启账号密码登陆,需要再配置表中修改: vim /etc/ssh/sshd_configPermitRootLogin yes #是否可以使用root账户登陆PasswordAuthentication yes #是都开启密码登陆ser...

Kefy ⋅ 41分钟前 ⋅ 0

Zookeeper3.4.11+Hadoop2.7.6+Hbase2.0.0搭建分布式集群

有段时间没更新博客了,趁着最近有点时间,来完成之前关于集群部署方面的知识。今天主要讲一讲Zookeeper+Hadoop+Hbase分布式集群的搭建,在我前几篇的集群搭建的博客中已经分别讲过了Zookeep...

海岸线的曙光 ⋅ 48分钟前 ⋅ 0

js保留两位小数方法总结

本文是小编针对js保留两位小数这个大家经常遇到的经典问题整理了在各种情况下的函数写法以及遇到问题的分析,以下是全部内容: 一、我们首先从经典的“四舍五入”算法讲起 1、四舍五入的情况...

孟飞阳 ⋅ 今天 ⋅ 0

python log

python log 处理方式 log_demo.py: 日志代码。 #! /usr/bin/env python# -*- coding: utf-8 -*-# __author__ = "Q1mi""""logging配置"""import osimport logging.config# 定义三种......

inidcard ⋅ 今天 ⋅ 0

mysql 中的信息数据库以及 shell 查询 sql

Information_schema 是 MySQL 自带的信息数据库,里面的“表”保存着服务器当前的实时信息。它提供了访问数据库元数据的方式。 什么是元数据呢?元数据是关于数据的数据,如数据库名或表名,...

blackfoxya ⋅ 今天 ⋅ 0

maven配置阿里云镜像享受飞的感觉

1.在maven目录下的conf/setting.xml中找到mirrors添加如下内容,对所有使用改maven打包的项目生效。 <mirror> <id>alimaven</id> <name>aliyun maven</name> <url>http://maven.al......

kalnkaya ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部