一定要使用-server参数来调试并发程序
在阅读JCIP的时候想手工测试一下,结果发现总是没有出现书中描述的并发问题
后来我琢磨,以前记得书上说过,在debugging的环境下,JVM是低并发的,一定要在server的环境下测试,让JVM在高并发的情况下使用,才容易测试出并发BUG,最简便的方法就是给JVM添加上-server的运行参数
代码如下,JCIP Listing3.15
class Holder {
private int n;
private static Random random = new Random();
public Holder(int n) {
this.n = n;
}
public void changeValue() {
n = random.nextInt();
}
public void assertSanity() {
if (n != n) {
throw new AssertionError("n != n");
}
}
}
class Checker implements Runnable {
private boolean stop = false;
private Holder holder;
public Checker(Holder holder) {
this.holder = holder;
}
public synchronized void stop() {
stop = true;
}
@Override
public void run() {
while (!stop) {
try {
// System.out.println("checking");
holder.assertSanity(); //! Possible to throw exception in concurrent circumstances
} catch (Throwable e) {
System.out.println(e);
stop();
}
}
}
}
class Modifier implements Runnable {
private boolean stop = false;
private Holder holder;
public Modifier(Holder holder) {
this.holder = holder;
}
public synchronized void stop() {
stop = true;
}
@Override
public void run() {
while (!stop) {
// System.out.println("modifying");
holder.changeValue();
}
}
}
public class Listing3_15 {
public static void main(String[] args) {
ExecutorService exec = null;
Holder holder = null;
Modifier m1 = null, m2 = null;
Checker checker = null;
Scanner scanner = null;
try {
exec = Executors.newCachedThreadPool();
holder = new Holder(10);
m1 = new Modifier(holder);
m2 = new Modifier(holder);
checker = new Checker(holder);
exec.execute(checker);
exec.execute(m1);
exec.execute(m2);
scanner = new Scanner(System.in);
scanner.next(); // pause
} finally {
m1.stop();
m2.stop();
checker.stop();
exec.shutdown();
scanner.close();
}
}
}
果然,在debug的环境下,JVM跑不出这个并发BUG,添加-server参数之后,JVM就跑出这个并发BUG了,在eclipse中设置-server参数的方法如下:Run>Run Configurations>Arguments>VM Arguments,写上-server即可

一定要使用-server参数来调试并发程序的更多相关文章
- Zabbix Server参数文件详解
Zabbix的配置文件一般有三种: zabbix_server.conf:zabbix server的配置文件 zabbix_proxy.conf:zabbix proxy的配置文件 zabbix_a ...
- appium server参数
转自: http://m.blog.csdn.net/blog/kittyboy0001/40893979 appium Appium是一个开源的,适用于原生或混合移动应用应用( hybrid mob ...
- SQL Server 参数嗅探问题
摘要 MSSQL Server参数嗅探既是一个涉及知识面非常广泛,又是一个比较难于解决的课题,即使对于数据库老手也是一个比较头痛的问题.这篇文章从参数嗅探是什么,如何产生,表象是什么,会带来哪些问题, ...
- VS2013中带命令行参数的调试方法---C++
今天先记录一下(也是传说中大神喜欢装逼的comment line)c++中向主函数int main(int argc,char** argv )传递4中方法,欢迎添加新方法, 然后可以参考别人写的很好 ...
- vscode带命令行参数进行调试
vscode带命令行参数进行调试 2.输入代码 { // 使用 IntelliSense 了解相关属性. // 悬停以查看现有属性的描述. // 欲了解更多信息,请访问: https://go.mic ...
- 使用 GDB 调试多进程程序
使用 GDB 调试多进程程序 GDB 是 linux 系统上常用的调试工具,本文介绍了使用 GDB 调试多进程程序的几种方法,并对各种方法进行比较. 3 评论 田 强 (tianq@cn.ibm.co ...
- 使用webstorm调试node程序
前言 相信大家接触过不少node代码了,如果你应用的比较初级或者针对你的项目不需要接触过深的node代码,也许你仅仅需要简单的console.log('your variable')就完全满足你的需要 ...
- java远程调试(断点)程序/tomcat( eclipse远程调试Tomcat方法)
tomcat远程调试: 1.Linux中配置tomcat在catalina.sh中添加如下CATALINA_OPTS="-Xdebug -Xrunjdwp:transport=dt_soc ...
- PDB调试Python程序
pdb是python内置的调试工具, 它可以在终端中调试Python程序, 这允许pdb在很多无法安装IDE的服务器上使用. 虽然远程调试使用广泛, 但在必要的时候(比如难以在本地搭建运行环境)pdb ...
随机推荐
- iOS:沙盒、偏好设置、归档、解归档
一.沙盒和应用程序包 •iOS应用程序只能在为该改程序创建的文件系统中读取文件,不可以去其它地方访问,此区域被称为沙盒 •iOS常用目录: –Bundle –Documents –Library/Ca ...
- webshell三剑客[aspxspy、phpspy、jspspy]
ASPSPY:http://www.rootkit.net.cn/article.asp?id=132<已关闭> 下载:ASPXspy2 JSPSPY:http://www.forjj.c ...
- Linux下Anaconda的安装使用与卸载及问题解决
1. 安装 到官网下载对应的版本文件:Download Anaconda Now! 下载完之后,在终端输入: bash 下载好的文件 整个过程点几下回车就好了.但是到最后一步,会提示是否把anacon ...
- log4net 使用笔记
一.Log4net特征 1.自定义日志输出级别 Log4net将日志分为五个级别优先级从高到低依次:FATAL > ERROR > WARN > INFO > DEBUG,此外 ...
- Mongodb 常用命令2
1.把一个collection里面的数据复制到另一个collection中,比如category集合中数据备份到category_clone中 db.category.find().forEach(f ...
- hybrid app开发中用到的html5新特性localStorage、sessionStorage和websql database
近期在项目中进行hybrid app开发,项目中有大量的js代码执行在android设备上. 使用到了非常多HTML5的新特性,之前没有遇到过,不了解.这里记录下添加点前端的知识.混合式app开发中. ...
- zend studio 13.0.0 安装破解汉化
zend studio 13安装破解汉化步骤 官网原版下载 http://downloads.zend.com/studio-eclipse/13.0.0/ZendStudio-13.0.0-win3 ...
- [AngularJS] Angular 1.3 new $q constructor
<!DOCTYPE html> <html ng-app="app"> <head lang="en"> <meta ...
- Object.create(null) 和 {} 区别
Object.create(null) 创建一个空对象,此对象无原型方法. {} 其实是new Object(),具有原型方法. 应用: 使用Object.create(null)的一个重要应用是:创 ...
- 如何成为一位黑客 ( How To Become A Hacker )
http://blog.csdn.net/jarodlau/article/details/337891 How To Become A Hacker 如何成为一位黑客(转载) 这真是一个好问题,不止 ...