一. 概念与基础
book: 《Java并发编程实践》
《Java并发编程实践》笔记(Note of 《Java Concurrency in Practice》)(1-5章)
1)程序次序法则:
线程中每个动作A都happens-before于该线程中的每一个动作B,其中,在程序中,所有的动作B都出现在动作A之后。
2)监视器锁法则:
对一个监视器锁的解锁happens-before于每一个后续对同一监视器锁的加锁。
3)volatile变量法则:
对volatile域的写入操作happens-before于每一个后续对同一个域的读操作。
4)线程启动法则:
在一个线程里,对Thread.start的调用会happens-before于每一个启动线程中的动作。
5)线程终结法则:
线程中的任何动作都happens-before于其他线程检测到这个线程已经终结、或者从Thread.join调用中成功返回,
或者Thread.isAlive返回false。
6)中断法则:
一个线程调用另一个线程的interrupt happens-before于被中断的线程发现中断
(通过抛出InterruptedException,或者调用isInterrupted和interrupted)。
7)终结法则:
一个对象的构造函数的结束happens-before于这个对象finalizer的开始。
8)传递性:
如果A happens-before于B,且B happens-before于C,则A happens-before于C。
book: 《Java虚拟机并发编程》
1. 确定线程数:
线程数=CPU可用核心数(Runtime.getRuntime().availableProcessors())/(1-阻塞系数)
阻塞系数取值范围为 (0-1),计算密集型任务的阻塞系数为0,IO密集型任务的阻塞系数接近1.
2. 确定任务数量:
使处理器一直保持忙碌状态比将负载均衡到每个子任务要实惠,尽可能对问题进行拆分以产生足够多的工作供处理器可用核心来执行。
1) 子任务的划分数应不少于处理器核心数;
2) 线程数多于处理器核心数对性能提升毫无帮助;
3) 在子任务划分数超过一定数量后,再增加子问题划分数对于性能的提升将十分有限。
3. 设计方法:
1) 共享可变性方法
2) 隔离可变性方法: 需保证可变变量切实被隔离开,且绝不会被超过一个线程访问。
3) 纯粹不可变性方法
4. Java7 Fork-Join API 非常适合于解决那些可以递归分解至小到足以顺序运行的问题。
5. 使用显示同步注意事项:
1) 在静态工厂方法而不是构造函数中创建线程;
2) 不要随意创建线程,而是使用线程池来降低任务启动时间和资源消耗;
3) 确保对可变字段的访问跨越内存栅栏,并对线程可见;
4) 通过正确评估程序所需要的锁的粒度来提高程序的并发度;
5) 当需要多个可变字段时,请核实对这些变量的访问是否是原子的,即要保证其他线程不会看到这些变量的部分修改结果。
6. STM 软件事务内存: 是一个针对并发问题的非常强大的编程模型,优点:
1) STM可以根据应用程序的行为来充分挖掘出其最大的并发潜力;
2) STM是一种锁无关的编程模型,可以提供良好的线程安全性和很高的并发性能;
3) STM可以保证实体仅能在事务内被更改;
4) STM没有显式锁意味着我们从此无需担心加锁顺序及其他相关问题;
5) STM没有显式锁的结果是无死锁的并发执行;
6) STM可以帮助我们减轻前期设计的决策负担,无需关心上锁,只需放心地交给动态隐式组合锁;
7) STM适用于对相同数据存在并发读且写冲突不频繁的应用场景。
8) Java版本的STM框架: Akka/Multiverse
二. “神器” in JDK
Java 理论与实践: JDK 5.0 中更灵活、更具可伸缩性的锁定机制
ConcurrentHashMap
HashMap和ConcurrentHashMap的并发性能测试
ConcurrentMap.putIfAbsent(key,value) 用法讨论 (要根据该方法的返回值进行处理,如下:)
public class Locale implements Cloneable, Serializable { private final static ConcurrentMap<String, Locale> map = new ConcurrentHashMap<String, Locale>(); public static Locale getInstance(String language, String country, String variant) { //... String key = some_string; Locale locale = map.get(key); if (locale == null) { locale = new Locale(language, country, variant); map.putIfAbsent(key, locale); } return locale; } // .... }
CopyOnWriteArrayList
与Collections.synchronizedMap性能比较
ConcurrentLinkedQueue
CompleteService
Callable
CyclicBarrier
淘宝面试题:如何充分利用多核CPU,计算很大的List中所有整数的和
ScheduledExecutorService
ScheduledExecutorService执行定时任务
在Timer和ScheduledExecutorService间抉择
三. 常见问题
1. 关于多线程环境中的单例
2. Thread Dump
How to Analyze Java Thread Dumps
3. 惰性初始化holder类技巧
@ThreadSafe public class ResourceFactory { private static class ResourceHolder { public static Resource resource = new Resource(); } public static Resource getResource() { return ResourceHolder.resource; } }
相关推荐
通过深入学习"Java并发编程与实践"文档,开发者能够提升自己在高并发环境下的编程能力,设计出更加健壮和高效的Java应用程序。这份资料对于理解Java并发原理、优化并发代码和解决并发问题具有极大的价值。
Java面试题+Java并发编程(J.U.C)+Java8实战+Redis+kafka Java 『必看』2021 版最新Java 学习路线图(持续刷新):+1::+1::+1: Java入门面试题 Java基础入门80问,适合新手,老鸟直接跳过 Java并发编程(J.U.C) ...
Java并发编程是Java开发中的重要领域,涉及到多线程、线程池以及线程局部变量等概念。在大型系统和高并发环境下,合理地利用这些技术可以极大地提高系统的性能和资源利用率。 一、线程池 线程池是Java并发编程中的...
《Java并发编程实践》这本书是Java开发者深入理解并发编程的重要参考资料。并发编程是现代软件开发中的核心技能之一,尤其是在多核处理器普及后,利用多线程进行并发处理已经成为提升程序性能的关键技术。这本书深入...
包含了java多线程基础介绍,多线程设计模式详解,juc包内对象详解,作为自己学习的记录,持续更新中
编写正确的程序很难,而编写正确的并发程序则难上加难。与串行程序相比,在并发程序中...同时在当今互联网的时代,大量的互联网应用都面对着海量的访问请求,因此,并发编程在我们的应用中成为越来越不可或缺的一部分。
Java虚拟机并发编程是Java开发中的重要组成部分,它涉及到多线程、同步机制、线程池等关键概念,是高效利用系统资源、提高程序响应速度的关键技术。在Java环境中,并发编程可以帮助开发者创建能够同时执行多个任务的...
编写正确的程序很难,而编写正确的并发程序则难上加难。与串行程序相比,在并发程序中...同时在当今互联网的时代,大量的互联网应用都面对着海量的访问请求,因此,并发编程在我们的应用中成为越来越不可或缺的一部分。
这是本人自己总结的关于在Java面试中一些常见的并发编程问题。免费分享给大家,希望对你们有用。如果有写的不对的地方,敬请大佬斧正!
学习如何设计和实现类,理解对象之间的关系,以及如何利用多态性提高代码的灵活性和可复用性,是Java编程的基础。 2. **异常处理**:Java提供了强大的异常处理机制,如try-catch-finally语句块,用于捕获和处理运行...
下面我们将详细探讨Java并发编程的相关知识点,并结合这个测试工具来解析其核心功能。 1. **Java并发编程基础** Java并发编程是Java平台的一个重要特性,它允许程序同时执行多个任务。Java提供了多种并发机制,...
同时,注意并发编程中的线程安全问题。 8. **测试驱动开发**:华为可能强调了TDD(Test Driven Development)的重要性,即先写测试用例,再编写满足测试的代码,确保代码质量。 9. **持续集成与自动化**:规范可能...
6. 并发编程 - 熟悉synchronized和volatile关键字的作用,理解其内存可见性的保证。 - 使用并发工具类,如AtomicInteger、CountDownLatch等,避免显式锁。 - 避免创建过多线程,考虑使用线程池,如...
《Java 实效编程百例》是一本专注于Java编程实践的书籍,旨在通过丰富的实例来提升开发者在实际项目中的技能和效率。在这个压缩包中,包含了两个文件:www_sj00_com.txt和Javasjoxoambao,它们可能是书中的一些代码...
Java网络编程是Java开发中的重要领域,它涵盖了网络通信的基础概念...通过深入学习"Java网络编程与分布式计算",开发者可以掌握构建大规模、高性能网络应用和分布式系统的技能,为现代互联网和云计算环境打下坚实基础。
这个压缩包“Java经典编程题汇总”显然是一份宝贵的资源,它集合了作者在跳槽过程中积累的笔试题目和面试经验,旨在帮助有需要的人进行系统性的学习和准备。 Java编程题涵盖了许多关键领域,包括但不限于: 1. **...
理解并发编程原理和实践,有助于提升程序的性能和响应速度。 7. **网络编程**:Java提供了Socket编程API,可以创建客户端和服务器端应用程序,实现网络通信。学习TCP和UDP协议,理解套接字的使用,是开发网络应用的...
其次,第二个文档——"Java并发编程实战(中文)",则聚焦于Java的多线程和并发处理能力。并发编程是现代软件开发中的重要部分,特别是在多核处理器和分布式系统中。Java提供了丰富的并发工具,如Thread、...
对于并发编程,《Java并发编程实战》(Brian Goetz)是一本经典,它详细解释了多线程和并发控制,帮助开发者理解Java并发机制。 在深入学习阶段,《Java虚拟机规范》(James Gosling等)可以帮助读者理解Java运行时环境...
在Java领域,高并发系统设计是一项至关重要的技能,它涉及到如何构建能够同时处理大量请求的高效应用程序。...在实践中,我们需要结合具体业务场景灵活运用,并持续学习新的并发技术和最佳实践,以适应技术的快速发展。