一. 概念与基础
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语言中最为复杂且重要的部分之一,它涉及了多线程编程、内存模型、...随着硬件性能的持续提升和应用需求的多样化,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并发编程的实际应用,我们可以考虑一个简单的例子——使用`Future`和`Callable`来实现异步任务的执行。假设有一个复杂的计算任务需要长时间执行,但主程序不能等待这个任务完成。此时,可以将计算...
《Java并发编程实战》是一本深入探讨Java多线程和并发编程的经典著作,它由Brian Goetz、Tim Peierls、Joshua...这本书涵盖了大量示例和最佳实践,对于想要在Java并发编程领域深入学习的人来说,是不可或缺的参考资料。
总而言之,Java并发编程实践是一门涉及多方面的技术,需要理解操作系统中的进程和线程模型,掌握Java中线程的创建、控制和协作,以及学习如何使用并发工具来解决并发编程中出现的问题。这些知识共同构成了Java并发...
《Java并发编程实践》这本书是Java开发者深入理解并发编程的重要参考资料。并发编程是现代软件开发中的核心技能之一,尤其是在多核处理器普及后,利用多线程进行并发处理已经成为提升程序性能的关键技术。这本书深入...
包含了java多线程基础介绍,多线程设计模式详解,juc包内对象详解,作为自己学习的记录,持续更新中
这份名为"toBeBetterJavaer-master"的压缩包文件,提供了一份全面且深入的Java学习资源,旨在帮助学习者从初级到高级逐步提升Java技能,同时涵盖了Java并发编程、Java虚拟机(JVM)以及Java在企业级开发中的应用,还...
编写正确的程序很难,而编写正确的并发程序则难上加难。与串行程序相比,在并发程序中...同时在当今互联网的时代,大量的互联网应用都面对着海量的访问请求,因此,并发编程在我们的应用中成为越来越不可或缺的一部分。
根据提供的信息,我们可以推断出该资源主要关注的是“Java并发编程实践”的相关内容,并且它是一...这些内容覆盖了从基本概念到高级应用的多个方面,对于希望深入学习Java并发编程的开发者来说是非常有价值的参考资料。
《Java并发编程全面试题解析》 并发编程是现代软件开发中的关键组成部分,尤其在多核处理器环境下,其重要性不言而喻。Java作为企业级应用的首选语言,提供了丰富的并发编程工具和机制,帮助开发者构建高效且稳定的...
在Java并发编程中,阻塞队列和阻塞栈是两个重要的并发数据结构,它们在多线程环境下的高效通信和资源管理中扮演着至关重要的角色。这些数据结构源自Java的并发包`java.util.concurrent`,是实现并发设计模式如生产者...
4. **进阶技术**:了解设计模式、JVM调优、Java并发编程、网络编程和数据库连接(JDBC)等。 5. **框架与工具**:熟悉常用的Java框架如Spring、Hibernate和MyBatis,以及开发工具如Eclipse、IntelliJ IDEA等。 #### ...
Java是一种广泛使用的编程语言,它在网络编程方面具有强大的能力,尤其是在处理高并发环境时。Java网络编程的核心技术之一是NIO(Non-blocking IO),它提供了比传统IO(BIO,Blocking IO)更高效的数据传输方式,...
Java虚拟机并发编程是Java开发中的重要组成部分,它涉及到多线程、同步机制、线程池等关键概念,是高效利用系统资源、提高程序响应速度的关键技术。在Java环境中,并发编程可以帮助开发者创建能够同时执行多个任务的...