《Java程序性能优化》学习笔记 并行程序优化

简介:

第四章 并行程序优化
4.1 并行程序设计模式
4.2 JDK多任务执行框架
4.3 JDK并发数据结构
4.4 并发控制方法
4.5 锁的性能和优化
4.6 无锁的并行计算

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());
        }
}
复制代码

 

3.Amino框架。使用无锁算法的主要缺点在于需要在应用层处理线程间的冲突问题。Amino提供了可用于线程安全的、基于无锁算法的一些数据结构,同时内置了一些多线程调度模式。
4.Amino集合。
5.Amino树。
6.Amino图。
7.Amino简单调度模式,最典型的是Master-Worker模式。Amino提供了两套实现,即静态和动态实现。

 

4.7 协程
1.线程是对进程的进一步分割,协程可以理解为对线程的进一步分割。
在Lua语言中对协程做了很好的实现。
2.Java原生语言不支持协程,Kilim是一个流行的协程框架。
使用协程,可以让系统以更低的成本,支持更高的并行度。


目录
相关文章
|
7天前
|
Java 数据库连接 数据库
优化之路:Java连接池技术助力数据库性能飞跃
在Java应用开发中,数据库操作常成为性能瓶颈。频繁的数据库连接建立和断开增加了系统开销,导致性能下降。本文通过问题解答形式,深入探讨Java连接池技术如何通过复用数据库连接,显著减少连接开销,提升系统性能。文章详细介绍了连接池的优势、选择标准、使用方法及优化策略,帮助开发者实现数据库性能的飞跃。
16 4
|
4天前
|
存储 Java 开发者
成功优化!Java 基础 Docker 镜像从 674MB 缩减到 58MB 的经验分享
本文分享了如何通过 jlink 和 jdeps 工具将 Java 基础 Docker 镜像从 674MB 优化至 58MB 的经验。首先介绍了选择合适的基础镜像的重要性,然后详细讲解了使用 jlink 构建自定义 JRE 镜像的方法,并通过 jdeps 自动化模块依赖分析,最终实现了镜像的大幅缩减。此外,文章还提供了实用的 .dockerignore 文件技巧和选择安全、兼容的基础镜像的建议,帮助开发者提升镜像优化的效果。
|
5天前
|
Java 数据库连接 数据库
Java连接池在数据库性能优化中的重要作用。连接池通过预先创建和管理数据库连接,避免了频繁创建和关闭连接的开销
本文深入探讨了Java连接池在数据库性能优化中的重要作用。连接池通过预先创建和管理数据库连接,避免了频繁创建和关闭连接的开销,显著提升了系统的响应速度和吞吐量。文章介绍了连接池的工作原理,并以HikariCP为例,展示了如何在Java应用中使用连接池。通过合理配置和优化,连接池技术能够有效提升应用性能。
16 1
|
9天前
|
缓存 前端开发 JavaScript
9大高性能优化经验总结,Java高级岗必备技能,强烈建议收藏
关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。本文介绍了9种性能优化方法,涵盖代码优化、数据库优化、连接池调优、架构层面优化、分布式缓存、异步化、Web前端优化、服务化、硬件升级、搜索引擎和产品逻辑优化。欢迎留言交流。
|
9天前
|
存储 缓存 Java
Java应用瘦身记:Docker镜像从674MB优化至58MB的实践指南
【10月更文挑战第22天】 在容器化时代,Docker镜像的大小直接影响到应用的部署速度和运行效率。一个轻量级的Docker镜像可以减少存储成本、加快启动时间,并提高资源利用率。本文将分享如何将一个Java基础Docker镜像从674MB缩减到58MB的实践经验。
21 1
|
10天前
|
消息中间件 监控 算法
Java性能优化:策略与实践
【10月更文挑战第21】Java性能优化:策略与实践
|
10天前
|
SQL 监控 Java
Java性能优化:提升应用效率与响应速度的全面指南
【10月更文挑战第21】Java性能优化:提升应用效率与响应速度的全面指南
|
11天前
|
存储 算法 Java
Java虚拟机(JVM)的内存管理与性能优化
本文深入探讨了Java虚拟机(JVM)的内存管理机制,包括堆、栈、方法区等关键区域的功能与作用。通过分析垃圾回收算法和调优策略,旨在帮助开发者理解如何有效提升Java应用的性能。文章采用通俗易懂的语言,结合具体实例,使读者能够轻松掌握复杂的内存管理概念,并应用于实际开发中。
|
11天前
|
缓存 算法 Java
Java 中常见的性能优化
【10月更文挑战第19天】Java 性能优化是一个复杂而又重要的课题,需要我们在实践中不断积累经验,掌握各种优化技巧,并结合具体情况灵活运用。通过持续的优化努力,我们可以让 Java 程序更加高效、稳定地运行,为用户提供更好的使用体验。你在性能优化方面还有哪些独特的见解或经验呢?欢迎与我分享,让我们一起在性能优化的道路上不断探索和进步。
33 3
|
16天前
|
Java Maven 数据安全/隐私保护
如何实现Java打包程序的加密代码混淆,避免被反编译?
【10月更文挑战第15天】如何实现Java打包程序的加密代码混淆,避免被反编译?
27 2