一定要使用-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 ...
随机推荐
- make&&gcc/g++ 生成 map file
map file 对于嵌入式开发是非常有用的,尤其是当你开发的module引起了 kernel panic 的时候. 仅写作Mark用 make: $vim makefile (add " ...
- go语言基础之有参有返回值函数的使用
1.有参有返回值函数的使用 示例1: package main //必须 import "fmt" //go官方推荐写法 func MaxAndMin(a, b int) (max ...
- TortoiseSVN 源代码下载
SVN的客户端软件TortoiseSVN http://tortoisesvn.tigris.org/ 这是我采用的 TortoiseSVN 的官方网站,页面上的两只小乌龟真的很好看. 目前最新的版本 ...
- android 开源组件合集-UI篇(2013-11-07更新)
其实也算不上合集,只是将我经常用到的部分整理一下,如果您有好东西,也可以留言补充 1.actionbar http://actionbarsherlock.com/ https://github.co ...
- spring错误汇总
在学习spring过程中遇见了种种不同的异常错误,这里做了一下总结.希望遇见类似错误的同学们共勉一下. 1. 错误一 Error creating bean with name 'helloServi ...
- 算法笔记_138:稳定婚姻问题(Java)
目录 1 问题描述 2 解决方案 1 问题描述 何为稳定婚姻问题? 有一个男士的集合Y = {m1,m2,m3...,mn}和一个女士的计划X = {n1,n2,n3,...,nn}.每一个男士有 ...
- Selenium WebDriver问题--Internet Explorer保护模式设置问题
在用WebDriver中打开Internet Explorer访问百度的是,报下面错误: org.openqa.selenium.remote.SessionNotFoundException: Un ...
- iterator [ɪtə'reɪtə] 遍历器
lterator 遍历器 遍历器是一种接口,它为不同的数据结构提供了统一的访问机制. 如果一个数据结构具有遍历器接口,那么就可以依次处理该数据结构的成员. 当前 javascript 用来表示集合的数 ...
- JavaWeb 获取请求网络协议、IP、端口号、项目根路径
JavaWeb 获取请求网络协议.IP.端口号.项目根路径 CreateTime--2018年6月1日16点32分 Author:Marydon 1.需求 在项目中,需要使用Java向本程序发送r ...
- windows合并文件夹窗口
windows合并文件夹窗口 CreateTime--2017年7月26日16:28:14Author:Marydon 右击任务栏-->属性-->任务栏按钮选项-->选择“始终合 ...