《实战Java高并发程序设计》读书笔记

简介: 有助于提高锁性能的几点建议1、减少锁持有的时间——–只在必要时进行同步2、减小锁的粒度 ConcurrentHashMap(只有获取全局信息的方法调用不频繁时,这种方法才能真正意义...

有助于提高锁性能的几点建议

1、减少锁持有的时间——–只在必要时进行同步

2、减小锁的粒度
ConcurrentHashMap(只有获取全局信息的方法调用不频繁时,这种方法才能真正意义上提高系统吞吐量)

3、读写分离锁替代独占锁——–ReadWriteLock

4、锁分离的思想——–LinkedBlockingQueue take()、put()使用不同的锁

5、锁粗化

虚拟机在遇到一连串连续地对同一锁不断进行请求和释放的操作时,便会把所有的锁操作整合成对锁的一次请求,从而减少对锁的请求同步次数。

例如:

public void demoMethod(){
   synchronized(lock){
       //do sth
   }
   //做其他不需要同步的工作,但能很快执行完毕
   synchronized(lock){
       //do sth
   }
}

会被整合成:

public void demoMethod(){
   //整合成一次锁请求
   synchronized(lock){
       //do sth
      //做其他不需要同步的工作,但能很快执行完毕
   }
}

还有在循环内请求锁的时候,有必要对锁进行粗化:

for(int i=0;i<n;i++){
   synchronized(lock){
       //do sth
   }
}

一种更加合理的做法应该是在外层只请求一次锁:

synchronized(lock){
    for(int i=0;i<n;i++){

    }
}

并行模式与算法

1、单例模式

2、不变模式

3、生产者-消费者模式

4、Future模式

Future模式是多线程开发中非常常见的一种设计模式,它的核心思想是异步调用。(JDK应用:Callable接口)

5、并行流水线

6、并行搜索

7、并行排序

8、并行算法:矩阵乘法


线程池相关

线程池核心参数

参数 含义
corePoolSize 线程池中的核心线程数
maximumPoolSize 线程池中的最大线程数量
keepAliveTime 多余的空闲线程的存活时间
unit keepAliveTime单位
workQueue 任务队列,被提交但是尚未被执行的任务
threadFactory 线程工厂
handler 拒绝策略

线程池的拒绝策略

策略 含义
AbortPolicy 直接抛出异常,阻止系统正常工作
CallerRunsPolicy 只要线程池未关闭,直接在调用者线程中,运行当前被丢弃的任务(性能急剧下降)
DiscardOledestPolicy 丢弃最老的一个请求
DiscardPolicy 默默的丢弃无法处理的任务


定义:守护线程是一种特殊的线程,它是系统的守护者,在后台默默地完成一些系统性的服务,比如垃圾回收线程、JIT线程就可以理解为守护线程。


接口Callable与Runnable区别

1)Callable接口的call()方法可以有返回值,而Runnable接口的run()方法没有返回值。

2)Callable接口的call()方法可以声明抛出异常,而Runnable接口的run()方法不可以声明抛出异常。


方法excute()与submit()的区别

1) 方法excute()没有返回值,而submit()方法可以有返回值。

2)方法excute()在默认的情况下异常直接抛出,不能捕获,但可以通过自定义Thread-Factory的方式进行捕获,而submit()方法在默认情况下,可以有catch Execution-Exception捕获异常。

相关文章
|
9天前
|
消息中间件 Java Kafka
"Kafka快速上手:从环境搭建到Java Producer与Consumer实战,轻松掌握分布式流处理平台"
【8月更文挑战第10天】Apache Kafka作为分布式流处理平台的领头羊,凭借其高吞吐量、可扩展性和容错性,在大数据处理、实时日志收集及消息队列领域表现卓越。初学者需掌握Kafka基本概念与操作。Kafka的核心组件包括Producer(生产者)、Broker(服务器)和Consumer(消费者)。Producer发送消息到Topic,Broker负责存储与转发,Consumer则读取这些消息。首先确保已安装Java和Kafka,并启动服务。接着可通过命令行创建Topic,并使用提供的Java API实现Producer发送消息和Consumer读取消息的功能。
32 8
|
11天前
|
jenkins Java 持续交付
【一键搞定!】Jenkins 自动发布 Java 代码的神奇之旅 —— 从零到英雄的持续集成/部署实战秘籍!
【8月更文挑战第9天】随着软件开发自动化的发展,持续集成(CI)与持续部署(CD)已成为现代流程的核心。Jenkins 作为一款灵活且功能丰富的开源 CI/CD 工具,在业界应用广泛。以一家电商公司的 Java 后端服务为例,通过搭建 Jenkins 自动化发布流程,包括创建 Jenkins 项目、配置 Git 仓库、设置构建触发器以及编写构建脚本等步骤,可以实现代码的快速可靠部署。
34 2
|
23天前
|
Java Android开发 C++
🚀Android NDK开发实战!Java与C++混合编程,打造极致性能体验!📊
【7月更文挑战第28天】在 Android 开发中, NDK 让 Java 与 C++ 混合编程成为可能, 从而提升应用性能。**为何选 NDK?** C++ 在执行效率与内存管理上优于 Java, 特别适合高性能需求场景。**环境搭建** 需 Android Studio 和 NDK, 工具如 CMake。**JNI** 构建 Java-C++ 交互, 通过声明 `native` 方法并在 C++ 中实现。**实战** 示例: 使用 C++ 计算斐波那契数列以提高效率。**总结** 混合编程增强性能, 但增加复杂性, 使用前需谨慎评估。
58 4
|
3天前
|
设计模式 存储 Java
掌握Java设计模式的23种武器(全):深入解析与实战示例
掌握Java设计模式的23种武器(全):深入解析与实战示例
|
1月前
|
缓存 监控 Java
Java虚拟机(JVM)性能调优实战指南
在追求软件开发卓越的征途中,Java虚拟机(JVM)性能调优是一个不可或缺的环节。本文将通过具体的数据和案例,深入探讨JVM性能调优的理论基础与实践技巧,旨在为广大Java开发者提供一套系统化的性能优化方案。文章首先剖析了JVM内存管理机制的工作原理,然后通过对比分析不同垃圾收集器的适用场景及性能表现,为读者揭示了选择合适垃圾回收策略的数据支持。接下来,结合线程管理和JIT编译优化等高级话题,文章详细阐述了如何利用现代JVM提供的丰富工具进行问题诊断和性能监控。最后,通过实际案例分析,展示了性能调优过程中可能遇到的挑战及应对策略,确保读者能够将理论运用于实践,有效提升Java应用的性能。 【
125 10
|
1月前
|
前端开发 Java 关系型数据库
Java中的电子商务网站开发实战
Java中的电子商务网站开发实战
|
1月前
|
并行计算 Java API
Java中的函数式编程实战与Lambda表达式应用
Java中的函数式编程实战与Lambda表达式应用
|
1月前
|
安全 Java 调度
Java并发编程:从基础到实战
【7月更文挑战第3天】在Java的世界中,并发编程是一块充满挑战与机遇的领域。本文将带领读者从理解并发编程的基本概念开始,逐步深入到Java并发工具的使用和高级技巧的应用。我们将一起探索如何在多线程环境下保证数据的一致性和程序的正确性,以及如何通过高效的并发策略来提升应用性能。准备好,让我们开启Java并发编程的旅程,掌握让应用飞一般运行的秘密。
32 1
|
1月前
|
算法 Java 开发者
Java面试题:Java内存探秘与多线程并发实战,Java内存模型及分区:理解Java堆、栈、方法区等内存区域的作用,垃圾收集机制:掌握常见的垃圾收集算法及其优缺点
Java面试题:Java内存探秘与多线程并发实战,Java内存模型及分区:理解Java堆、栈、方法区等内存区域的作用,垃圾收集机制:掌握常见的垃圾收集算法及其优缺点
24 0
|
1月前
|
安全 Java 调度
Java面试题:Java内存优化、多线程安全与并发框架实战,如何在Java应用中实现内存优化?在多线程环境下,如何保证数据的线程安全?使用Java并发工具包中的哪些工具可以帮助解决并发问题?
Java面试题:Java内存优化、多线程安全与并发框架实战,如何在Java应用中实现内存优化?在多线程环境下,如何保证数据的线程安全?使用Java并发工具包中的哪些工具可以帮助解决并发问题?
37 0