在阅读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参数来调试并发程序的更多相关文章

  1. Zabbix Server参数文件详解

    Zabbix的配置文件一般有三种: zabbix_server.conf:zabbix server的配置文件 zabbix_proxy.conf:zabbix proxy的配置文件 zabbix_a ...

  2. appium server参数

    转自: http://m.blog.csdn.net/blog/kittyboy0001/40893979 appium Appium是一个开源的,适用于原生或混合移动应用应用( hybrid mob ...

  3. SQL Server 参数嗅探问题

    摘要 MSSQL Server参数嗅探既是一个涉及知识面非常广泛,又是一个比较难于解决的课题,即使对于数据库老手也是一个比较头痛的问题.这篇文章从参数嗅探是什么,如何产生,表象是什么,会带来哪些问题, ...

  4. VS2013中带命令行参数的调试方法---C++

    今天先记录一下(也是传说中大神喜欢装逼的comment line)c++中向主函数int main(int argc,char** argv )传递4中方法,欢迎添加新方法, 然后可以参考别人写的很好 ...

  5. vscode带命令行参数进行调试

    vscode带命令行参数进行调试 2.输入代码 { // 使用 IntelliSense 了解相关属性. // 悬停以查看现有属性的描述. // 欲了解更多信息,请访问: https://go.mic ...

  6. 使用 GDB 调试多进程程序

    使用 GDB 调试多进程程序 GDB 是 linux 系统上常用的调试工具,本文介绍了使用 GDB 调试多进程程序的几种方法,并对各种方法进行比较. 3 评论 田 强 (tianq@cn.ibm.co ...

  7. 使用webstorm调试node程序

    前言 相信大家接触过不少node代码了,如果你应用的比较初级或者针对你的项目不需要接触过深的node代码,也许你仅仅需要简单的console.log('your variable')就完全满足你的需要 ...

  8. java远程调试(断点)程序/tomcat( eclipse远程调试Tomcat方法)

    tomcat远程调试: 1.Linux中配置tomcat在catalina.sh中添加如下CATALINA_OPTS="-Xdebug  -Xrunjdwp:transport=dt_soc ...

  9. PDB调试Python程序

    pdb是python内置的调试工具, 它可以在终端中调试Python程序, 这允许pdb在很多无法安装IDE的服务器上使用. 虽然远程调试使用广泛, 但在必要的时候(比如难以在本地搭建运行环境)pdb ...

随机推荐

  1. java中构建同时兼容linux和windows程序时遇到的文件路径分割符问题解决方案

    最近在做一个自动上传文件的客户端,因为 file.getAbsolutePath()  在Mac和linux下的分割符是“/”,而在windows操作系统下的分割符则是“\”,我们程序中固然可以通过调 ...

  2. 转:Eclipse ADT的Custom debug keystore所需证书规格

    转:http://blog.k-res.net/archives/1229.html Eclipse ADT的Custom debug keystore所需证书规格 三月 8, 2013  |  Po ...

  3. 菜鸟从零学编程——GET与POST

    相信大家在面试的时候经常会被问到:GET与POST有什么区别吧?你是怎么回答的呢?POST比GEt安全?GET有URL的长度限制而POST没有或者很大?GET通过URL或者Cookie传参数,POST ...

  4. 百度地图总结第二篇--POI检索功能

    简单介绍: 眼下百度地图SDK所集成的检索服务包含:POI检索.公交信息查询.线路规划.地理编码.行政区边界数据检索.在线建议查询.短串分享(包含POI搜索结果分享.驾车/公交/骑行/步行路线规划分享 ...

  5. js 函数定义的2种方式

      js 函数定义的2种方式 CreateTime--2018年3月29日18:36:14 Author:Marydon 方式一: /** * 函数式声明 */ function mode() { c ...

  6. nginx配置用户认证

    location ~ .*admin\.php$ {             auth_basic "weifenglinux auth";             auth_ba ...

  7. 每秒处理3百万请求的Web集群搭建-为最佳性能调优 Nginx

    这篇文章是<打造3百万次请求/秒的高性能服务器集群>系列的第2部分,在这个部分中你可以使用任何一种 WEB 服务器,不过我决定使用 Nginx,因其轻量级.高可靠及高性能的优点. 通常来说 ...

  8. 阿里云服务器迁移更改IP,导致网站挂掉

    从昨日下午三点阿里云主机迁移变更IP导致网站挂点,到刚刚网站.手机客户端均恢复访问,这个过程持续了24个钟头.最后还是我自己解决了问题. 哎,真是揪心. 其间和阿里云工程师反复沟通,昨日沟通到今日凌晨 ...

  9. LeetCode-2: Add Two Numbers

    [Problem:2-Add Two Numbers] You are given two non-empty linked lists representing two non-negative i ...

  10. IOS+openCV在Xcode的入门开发(转)

    看这篇文章之前先看看这个地址:OpenCV iOS开发(一)——安装 昨天折腾了一天,终于搞定了openCV+IOS在Xcode下的环境并且实现一个基于霍夫算法的圆形识别程序.废话不多说,下面就是具体 ...