《Java程序性能优化》之并发优化
第四章 并行程序优化
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程序性能优化》之并发优化的更多相关文章
- Java程序性能优化技巧
Java程序性能优化技巧 多线程.集合.网络编程.内存优化.缓冲..spring.设计模式.软件工程.编程思想 1.生成对象时,合理分配空间和大小new ArrayList(100); 2.优化for ...
- 《Java程序性能优化:让你的Java程序更快、更稳定》
Java程序性能优化:让你的Java程序更快.更稳定, 卓越网更便宜,不错的书吧
- [JAVA] java程序性能优化
一.避免在循环条件中使用复杂表达式 在不做编译优化的情况下,在循环中,循环条件会被反复计算,如果不使用复杂表达式,而使循环条件值不变的话,程序将会运行的更快. 例子: import java.util ...
- Java程序性能定位工具-火焰图
Java程序性能定位工具-火焰图 前言 Java火焰图是一种新的查看CPU利用率方式.今天就带大家一起使用来自Google大神的工具来生成火焰图.火焰图非常的直观,问题一目了然,希望有一天它能成为JA ...
- Java程序性能优化读书笔记(一):Java性能调优概述
程序性能的主要表现点: 执行速度:程序的反映是否迅速,响应时间是否足够短 内存分配:内存分配是否合理,是否过多地消耗内存或者存在内存泄漏 启动时间:程序从运行到可以正常处理业务需要花费多少时间 负载承 ...
- java程序性能优化
一.避免在循环条件中使用复杂表达式 在不做编译优化的情况下,在循环中,循环条件会被反复计算,如果不使用复杂表达式,而使循环条件值不变的话,程序将会运行的更快. 例子: import java.util ...
- Java程序性能优化——让你的java程序更快、更稳定
1.Java性能调优概述 1.1.Web服务器,响应时间.吞吐量是两个重要的性能参数. 1.2.程序性能的几个表现: 执行速度:程序的反映是否迅速,响应时间是否足够短 内存分配:分配是否合理,是否过多 ...
- 《Java程序性能优化》学习笔记 设计优化
豆瓣读书:http://book.douban.com/subject/19969386/ 第一章 Java性能调优概述 1.性能的参考指标 执行时间: CPU时间: 内存分配: 磁盘吞吐量: 网络吞 ...
- 《Java程序性能优化》之设计优化
豆瓣读书:http://book.douban.com/subject/19969386/ 第一章 Java性能调优概述 1.性能的参考指标 执行时间: CPU时间: 内存分配: 磁盘吞吐量: 网络吞 ...
- Java程序性能优化之性能概述
性能的基本概念 一).什么叫程序的性能? 程序运行所需的内存和时间. 二).性能的表现形式: 1).执行速度: 程序的反应是否迅速,响应时间是否足够短. 2).启动时间:程序从运行到可以处理正常业务所 ...
随机推荐
- VS2015(Xamarin)开发安卓WebApp笔记
有关WebApp的开发,大多数人都用了第三方框架,如Cordova等.我这里没有用到这类框架,而是新建了一个WebView嵌入Assets(本地资源)来完成这个App,由于第一个练习App希望对初学者 ...
- 7.SpringBoot 之 Web
添加资源处理 package org.springframework.boot.autoconfigure.web.servlet. public class WebMvcAutoConfigurat ...
- sql工具和手工注入总结
普通注入: 数字注入 字符注入 base64注入:和常规的方法没有说明区别,主要是解码然后编码: 如果普通注入不行,尝试大小写绕过,编码等绕过: 如果不行尝试盲注: POST注入 0x00 常用的 注 ...
- 拆分窗口QSplitter
拆分窗口中可以添加许多子控件,各个子控件通过拆分线相互分隔开来,拖动该拆分线可以随意改变子控件大小 import sys from PyQt5.QtCore import Qt from PyQt5. ...
- luogu P3198 [HNOI2008]遥远的行星
bzoj 洛谷 这题意是不是不太清楚 真正题意:求\[f_i=\sum_{j=1}^{\lfloor i*A \rfloor} \frac{M_i*M_j}{i-j}\] 似乎只能\(O(n*\lfl ...
- Caffe源码阅读(1) 全连接层
Caffe源码阅读(1) 全连接层 发表于 2014-09-15 | 今天看全连接层的实现.主要看的是https://github.com/BVLC/caffe/blob/master/src ...
- SSH开发环境搭建
断断续续学习hibernate也有一段时间了,在这里研究一下SSH开发环境的搭建过程,自己简单的搭建一个SSH的开发环境.采用maven搭建. 0.项目结构: 1.导包:(maven项目) pom.x ...
- 教你如何使用android studio发布release 版本【转】
原文链接 想必还有人对如何在Android studio (以下简称as)发布release版本的app而狂刷百度吧?都是过来人,我很理解这种心情,百度到的基本是半成品,为什么这么说呢?百度一下,你就 ...
- 对numpy中shape的理解
from:http://blog.csdn.net/by_study/article/details/67633593 环境:Windows, Python3.5 一维情况: >>> ...
- MFC创建线程示例
MFC创建线程示例 AfxBeginThread() 创建现场的方法是AfxBeginThread()函数. 在[.CPP]文件定义一个全局变量,决定什么时候退出这个线程. BOOL g_bWillE ...