第四章 并行程序优化

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. POJ 2796[UVA 1619] Feel Good

    Feel Good Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 16786   Accepted: 4627 Case T ...

  2. Java编程思想 学习笔记5

    五.初始化与清理 1.用构造器确保初始化  在Java中,通过提供构造器,类的设计者可确保每个对象都会得到初始化.创建对象时,如果其类具有构造器,Java就会在用户有能力操作对象之前自动调用相应的构造 ...

  3. <table>居中的一种方法

    <div title="主页" data-options="iconCls:'icon-house'"> <center> <ta ...

  4. Springboot使用FastJson后,接口返回中文乱码的问题解决。

    哎,天下文章一大抄,到处都是一模一样的教你怎么替换掉jackson成fastjson的,可后续中文乱码网上居然没一篇文章.翻了一会源码还是写个文章共享下吧.免得后来人又浪费时间折腾. 在springb ...

  5. Database学习 - mysql 数据库 外键

    外键 外键约束子表的含义:如果在父表中赵达不到候选键,则不允许在子表上进行insert/update 外键预约对父表的含义:在父表上进行update/delete以更新或删除子表中有一条或多条对应匹配 ...

  6. Debian & CentOS建立本地iso源

    在宿舍搞开发的时候经常遇到有些工具需要安装,没有网络,这时候只能靠mount本地的iso镜像来搞,结果像Debian有3张安装光盘,CentOS有2张光盘,有时候安装包不在第一张光盘里,而在第二张光盘 ...

  7. 【tomcat】sessionId学习(未完待续)

    这里主要研究tomcat中session的管理方式以及sessionId的原理,下文将研究sessionid存到redis中以及基于redis实现session共享. 平时也就是了解session是基 ...

  8. BackBone结合ASP.NET MVC实现页面路由操作

    1. 问题的背景 什么是页面路由操作,就是通过浏览器地址栏的标记来实现页面内部的一些操作,这些操作具有异步性和持久性.应用场景主要有页面操作过程中的添加收藏夹的操作.后退操作等过程中能完全恢复界面. ...

  9. DMA内存申请--dma_alloc_coherent 及 寄存器与内存【转】

    转自:https://blog.csdn.net/ic_soc_arm_robin/article/details/8203933 在项目驱动过程中会经常用到dma传输数据,而dma需要的内存有自己的 ...

  10. 关于 MVCC 的基础【转】

    1. 什么是MVCC 1.1 基础概念 MVCC,Multi-Version Concurrency Control,多版本并发控制.MVCC 是一种并发控制的方法,一般在数据库管理系统中,实现对数据 ...