在阅读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. MyEclipse中Ctrl+Shift+F快捷键格式化代码时不换行

    摘自: http://iteye.blog.163.com/blog/static/18630809620121166622410/ MyEclipse中Ctrl+Shift+F快捷键格式化代码时不换 ...

  2. linux 的空命令:(冒号)

    php里面又“空操作”这个东西,于是想一想linux的命令中是否有“空命令”这种东西,搜索一下,结果发现真的有这个东西存在 -------:) 冒号 : 就是空命令.即什么也不做,是一个命令占位符 # ...

  3. php内置的http server, 类似于nodejs里面和golang里面的

    原文:https://www.sitepoint.com/taking-advantage-of-phps-built-in-server/ ----------------------------- ...

  4. 格式化Curl返回的Json字符

    格式化Curl返回的Json字符 学习了:https://blog.csdn.net/guijiaoba/article/details/78235523 , 使用python工具 curl xxx ...

  5. Download Visual Studio

    Welcome to a new way to install Visual Studio! In our newest version, we've made it easier for you t ...

  6. Xamarin C# Android for Windows 安装

    Xamarin C# Android for Windows  安装 Xamarin的. Android手动安装 安装Xamarin的  Android在Windows机器上   大多数时候,Xama ...

  7. leetCode 86.Partition List(分区链表) 解题思路和方法

    Given a linked list and a value x, partition it such that all nodes less than x come before nodes gr ...

  8. 【数据压缩】LZW算法原理与源代码解析

    转载请注明出处:http://blog.csdn.net/luoshixian099/article/details/50331883 <勿在浮沙筑高台> LZW压缩算法原理很easy,因 ...

  9. 每日算法之二十三:Reverse Nodes in k-Group

    Given a linked list, reverse the nodes of a linked list k at a time and return its modified list. If ...

  10. Pytorch中的norm跟Numpy中的norm对比