《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).启动时间:程序从运行到可以处理正常业务所 ... 
随机推荐
- Spring 学习04
			一.上节内容回顾 1 基于aspectj的注解aop操作 2 spring的jdbcTemplate操作 (1)实现crud操作 - 添加.修改.删除update方法 - 查询 -- 查询某个值 qu ... 
- HTTP协议学习笔记---HTTP持久连接和如何正确地关闭HTTP连接
			一,持久连接 什么是持久连接?对于HTTP协议而言,它是基于请求响应模型,Client向Server发请求时,先建立一条HTTP连接,Server给Client响应数据后,连接关闭. 当Client发 ... 
- u-boot移植(七)---代码修改---存储控制器
			一.CPU访问芯片的条件 CPU通过访问存储控制器,来读取外部设备的数据. CPU想访问一个芯片,需要如下条件(配置信息): 地址线 数据线:8位/16位/32位数据宽度 时钟/频率 其他芯片相关的特 ... 
- Javascript定义变量
			在JavaScript中通过var来定义变量,不管是数字还是字符串,都可以通过这种方式来定义:我们既可以在声明变量的同时给变量赋值,也可以先声明变量,再给变量赋值. <script> va ... 
- (原创 开源)AppWidge的使用—桌面便利贴
			Android平台的一大特色就是支持桌面插件——AppWidget. 且不说,AppWidget是否会影响系统的流畅性,AppWidget确实是满足了用户个性化和快捷操作的需要. 常见的AppWidg ... 
- UDP网络程序,客户端和服务端交互原理
			创建一个udp客户端程序的流程是简单,具体步骤如下: 创建客户端套接字 发送/接收数据 关闭套接字 UDP是面向无连接的通讯协议,UDP数据包括目的端口号和源端口号信息,由于通讯不需要连接,所以可以实 ... 
- JavaScript学习 - 基础(四) - 控制语句/异常处理
			控制语句 if-else 语句 <script> //控制语句 //if-else格式: var x = 1 if(x==1){ console.log("this is if& ... 
- 简单理解Zookeeper的Leader选举【转】
			Leader选举是保证分布式数据一致性的关键所在.Leader选举分为Zookeeper集群初始化启动时选举和Zookeeper集群运行期间Leader重新选举两种情况.在讲解Leader选举前先了解 ... 
- sync_binlog innodb_flush_log_at_trx_commit 浅析【转】
			innodb_flush_log_at_trx_commit和sync_binlog 两个参数是控制MySQL 磁盘写入策略以及数据安全性的关键参数.本文从参数含义,性能,安全角度阐述两个参数为不同的 ... 
- 企业内部在centos7.2系统中必杀技NTP时间服务器及内网服务器时间同步(windows和linux客户端同步)
			网络时间协议NTP(Network Time Protocol)是用于互联网中时间同步的标准互联网协议.NTP的用途是把计算机的时间同步到某些时间标准.目前采用的时间标准是世界协调时UTC(Unive ... 
