第四章 并行程序优化

1.非阻塞同步避免了基于锁的同步的缺陷,无锁算法没有锁竞争带来的系统开销,也没有线程间频繁调度带来的开销。
CAS算法:包含3个参数CAS(v,e,n)。V表示要更新的变量,E表示预期值,N表示新值
2.JDK的java.util.concurrent.atomic包下,有一组使用无锁算法实现的原子操作类,如AtomicInteger/AtomicIntegerArray/AtomicLongArray等,

分别包装了对整数、整数数组、长整形数组等的多线程安全操作。

如:

public class AtomicTest {

    public static final int MAX_THREADS=3;
public static final int TASK_COUNT=3;
public static final int TARGET_COUNT=10000;
private AtomicInteger account=new AtomicInteger(0);//无锁的原子操作数量
private int count=0; //有锁的加法
private synchronized int add() {
return count++;
} //有锁的操作
private synchronized int getCount() {
return count;
} //实现有锁操作的内部类
public class SynchThread implements Runnable{ protected String name;
protected long starttime;
AtomicTest out;
public SynchThread(AtomicTest o,long starttime) {
out=o;
this.starttime=starttime;
} @Override
public void run() {
int v=out.add();//有锁的加法
while (v<TARGET_COUNT) {
v=out.add();//达到目标值前,不停的循环
}
long endtime=System.currentTimeMillis();//系统当前时间 精确到ms
System.out.println("SynchThread spend:"+(endtime-starttime)+"ms");
}
}
//实现原子操作的内部类
public class AtomicThread implements Runnable{ protected long starttime; public AtomicThread(long starttime){
this.starttime=starttime;
} @Override
public void run() {
int v=account.incrementAndGet();
while(v<TARGET_COUNT){
v=account.incrementAndGet();
}
long endtime=System.currentTimeMillis();
System.out.println("AtomicThread spend:"+(endtime-starttime)+"ms");
}
} /**
* JUnit方法测试
* @throws InterruptedException
*/
@Test
public void testAtomic() throws InterruptedException {
ExecutorService exe=Executors.newFixedThreadPool(MAX_THREADS);//初始化三个线程
long starttime=System.currentTimeMillis();
AtomicThread atomic=new AtomicThread(starttime); for(int i=0;i<TARGET_COUNT;i++){
exe.submit(atomic);//提交三个线程开始工作
}
Thread.sleep(1000);//重新分配
} // @Test
public void testSynch() throws InterruptedException {
ExecutorService exe=Executors.newFixedThreadPool(MAX_THREADS);
long starttime=System.currentTimeMillis();
SynchThread synch=new SynchThread(this,starttime); for(int i=0;i<TARGET_COUNT;i++){
exe.submit(synch);
}
Thread.sleep(1000);
//检测线程池是否关闭
System.out.println(exe.isTerminated());
}
}

第五章 JVM调优

1.JVM虚拟机将其内存数据分为程序计数器、虚拟机栈,本地方法栈,Java堆,和方法去等部分。

2.Java虚拟机栈,在Java 虚拟机规范中,定义了两种异常与占空间相关,即StackOverError和OutOfMemoryError。如果线程在计算过程中,请求的栈深度大于最大可用的栈深度,则抛出SOE,如果Java栈可以动态扩展,而在扩展栈的过程中,没有足够的内存空间来支持栈的扩展,则抛出OutOfMemoryError。
栈的大小直接决定了函数调用的可达深度。
如:

public class StackOverTest {
private int count=0;
public void recursion(){//没有出口的递归函数
count ++; //计数加一
recursion();
} @Test
public void stest(){
try{
recursion();//递归调用
}catch(Throwable t){
//打印栈的深度
System.out.println("the depth of stack is "+count);
t.printStackTrace();
}
}
}

 使用-Xss修改栈的大小后,函数调用深度明显上升。

 

《Java程序性能优化》之并发优化的更多相关文章

  1. Java程序性能优化技巧

    Java程序性能优化技巧 多线程.集合.网络编程.内存优化.缓冲..spring.设计模式.软件工程.编程思想 1.生成对象时,合理分配空间和大小new ArrayList(100); 2.优化for ...

  2. 《Java程序性能优化:让你的Java程序更快、更稳定》

    Java程序性能优化:让你的Java程序更快.更稳定, 卓越网更便宜,不错的书吧

  3. [JAVA] java程序性能优化

    一.避免在循环条件中使用复杂表达式 在不做编译优化的情况下,在循环中,循环条件会被反复计算,如果不使用复杂表达式,而使循环条件值不变的话,程序将会运行的更快. 例子: import java.util ...

  4. Java程序性能定位工具-火焰图

    Java程序性能定位工具-火焰图 前言 Java火焰图是一种新的查看CPU利用率方式.今天就带大家一起使用来自Google大神的工具来生成火焰图.火焰图非常的直观,问题一目了然,希望有一天它能成为JA ...

  5. Java程序性能优化读书笔记(一):Java性能调优概述

    程序性能的主要表现点: 执行速度:程序的反映是否迅速,响应时间是否足够短 内存分配:内存分配是否合理,是否过多地消耗内存或者存在内存泄漏 启动时间:程序从运行到可以正常处理业务需要花费多少时间 负载承 ...

  6. java程序性能优化

    一.避免在循环条件中使用复杂表达式 在不做编译优化的情况下,在循环中,循环条件会被反复计算,如果不使用复杂表达式,而使循环条件值不变的话,程序将会运行的更快. 例子: import java.util ...

  7. Java程序性能优化——让你的java程序更快、更稳定

    1.Java性能调优概述 1.1.Web服务器,响应时间.吞吐量是两个重要的性能参数. 1.2.程序性能的几个表现: 执行速度:程序的反映是否迅速,响应时间是否足够短 内存分配:分配是否合理,是否过多 ...

  8. 《Java程序性能优化》学习笔记 设计优化

    豆瓣读书:http://book.douban.com/subject/19969386/ 第一章 Java性能调优概述 1.性能的参考指标 执行时间: CPU时间: 内存分配: 磁盘吞吐量: 网络吞 ...

  9. 《Java程序性能优化》之设计优化

    豆瓣读书:http://book.douban.com/subject/19969386/ 第一章 Java性能调优概述 1.性能的参考指标 执行时间: CPU时间: 内存分配: 磁盘吞吐量: 网络吞 ...

  10. Java程序性能优化之性能概述

    性能的基本概念 一).什么叫程序的性能? 程序运行所需的内存和时间. 二).性能的表现形式: 1).执行速度: 程序的反应是否迅速,响应时间是否足够短. 2).启动时间:程序从运行到可以处理正常业务所 ...

随机推荐

  1. spring集成ActiveMQ居然要依赖这么多包

    做spring和ActiveMQ的集成,作maven依赖的时候有感(以前都不在乎,现在不一样了........省略) <!-- https://mvnrepository.com/artifac ...

  2. 消除 transition 闪屏

    .css { -webkit-transform-style: preserve-3d; -webkit-backface-visibility: hidden; -webkit-perspectiv ...

  3. 课程2:《黑马程序员_Java基础视频-深入浅出精华版》-视频列表-

    \day01\avi\01.01_计算机基础(计算机概述).avi; \day01\avi\01.02_计算机基础(计算机硬件和软件概述).avi; \day01\avi\01.03_计算机基础(软件 ...

  4. SQL Server 备份还原

    SQL Server支持三种备份方式 完全备份: 差异备份 事务日志备份 一般备份方式为,完全备份/每周,差异备份/每天,事务日志备份/按分钟计,这样可确保备份的高效性和可恢复性. 1. 完全备份 备 ...

  5. python3 三元表达式,列表解析

    python3 三元表达式,列表解析 三元表达式 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 x=2 y=3   if x > y ...

  6. HOG feature

  7. Advanced Installer 14.9 – WPF或winform应用程序打包成exe文件

    Advanced Installer14.9 下载地址:https://pan.baidu.com/s/1uj2QcxWcpGdqsjAinNPIAw 提取码:sa3r  选择Visual Studi ...

  8. 带你玩转Visual Studio——带你理解微软的预编译头技术

    原文地址:http://blog.csdn.net/luoweifu/article/details/49010627 不陌生的stdafx.h 还记得带你玩转Visual Studio——带你新建一 ...

  9. 一步步实现windows版ijkplayer系列文章之四——windows下编译ijkplyer版ffmpeg

    一步步实现windows版ijkplayer系列文章之一--Windows10平台编译ffmpeg 4.0.2,生成ffplay 一步步实现windows版ijkplayer系列文章之二--Ijkpl ...

  10. git 使用https 和SSH 提交远程库小总结

    一.使用https提交远程库 首先已经git commit -m “注释” 本地仓库关联远程github服务器:git remote add origin  “https://XXXX.git” 提交 ...