一. 概念与基础
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并发编程(J.U.C)+Java8实战+Redis+kafka Java 『必看』2021 版最新Java 学习路线图(持续刷新):+1::+1::+1: Java入门面试题 Java基础入门80问,适合新手,老鸟直接跳过 Java并发编程(J.U.C) ...
Java并发编程是Java开发中的重要领域,涉及到多线程、线程池以及线程局部变量等概念。在大型系统和高并发环境下,合理地利用这些技术可以极大地提高系统的性能和资源利用率。 一、线程池 线程池是Java并发编程中的...
包含了java多线程基础介绍,多线程设计模式详解,juc包内对象详解,作为自己学习的记录,持续更新中
编写正确的程序很难,而编写正确的并发程序则难上加难。与串行程序相比,在并发程序中...同时在当今互联网的时代,大量的互联网应用都面对着海量的访问请求,因此,并发编程在我们的应用中成为越来越不可或缺的一部分。
编写正确的程序很难,而编写正确的并发程序则难上加难。与串行程序相比,在并发程序中...同时在当今互联网的时代,大量的互联网应用都面对着海量的访问请求,因此,并发编程在我们的应用中成为越来越不可或缺的一部分。
这是本人自己总结的关于在Java面试中一些常见的并发编程问题。免费分享给大家,希望对你们有用。如果有写的不对的地方,敬请大佬斧正!
通过学习这款代码,您将能够更好地理解和掌握并发编程的原理,提高系统性能,优化资源利用率。 我们的目标是帮助广大开发者轻松应对高并发、多线程处理的挑战,提升个人技能,助力事业发展。这款代码简洁明了,易于...
理解接口的意义是理解Java多继承的一种优化方案,而多线程则是编程中的关键特性,它涉及并发执行的任务管理和资源管理。 在学习过程中,应该注重理论与实践相结合。在掌握Java的基础语法后,应深入学习Java的精华...
**多线程** - 内置的多线程支持使得并发编程变得容易。\n7. **动态性** - Java允许在运行时动态加载类和资源,增强了灵活性。\n8. **垃圾回收机制** - 自动的内存管理消除了程序员处理内存释放的负担。\n\n配置Java...
Java并发编程中,分布式锁是一种重要的机制,尤其在多服务器环境下的应用系统中,用于解决多个服务节点同时访问共享资源的问题。本讲座主要探讨了分布式锁的实现以及相关的并发概念,如互斥锁、共享锁、死锁、活锁、...
Java并发编程中,CAS(Compare and Swap,比较并交换)是一种无锁算法,常用于实现原子操作,它在多线程环境下提供了数据的一致性。然而,CAS并不是万能的,过度依赖或不当使用可能会导致问题。下面我们将深入探讨...
在并发编程中,Java提供了丰富的特性来支持多线程的执行和管理。以下是一些相关的知识点: 1. **守护线程与本地线程**:Java中的线程分为两类,守护线程(Daemon)和用户线程(User)。守护线程主要为其他线程提供服务...
通过这个项目,开发者不仅可以学习到基本的Java网络编程技巧,还能了解到如何实现并发处理、多线程编程、数据封装和解封装等核心概念。此外,项目还强调了实际应用中的交互设计和用户体验,这些都是开发高质量软件的...
线程的概念虽然抽象,但理解它是理解Java并发编程的关键。 在操作系统层面,线程是操作系统资源调度的基本单位。Java平台利用操作系统的线程机制来实现其自身的多线程功能。当执行一个Java程序时,Java虚拟机(JVM...
线程基础是理解并发编程的关键,它涉及到线程的状态转换、创建与使用方式、同步与协作机制等方面。 线程有五种基本状态: 1. 新建(New):线程被创建但尚未启动。 2. 可运行(Runnable):线程可能正在运行,也...
在上述的并发编程示例中,我们创建了两个线程:一个普通线程`WriterTask`和一个守护线程`CleanerTask`,用于处理事件队列`Deque<Event>`。 `WriterTask`实现了`Runnable`接口,负责向队列中写入事件。它有一个内部...
【MQ教程+Java编程】是关于IBM Websphere MQ这一消息中间件的深入学习与实践,特别是结合Java语言进行编程的教程。Websphere MQ,通常简称为MQ,是一种广泛应用于企业级分布式系统中的可靠消息传递平台,它允许不同...
在书籍方面,经典之作如《Java编程思想》、《Java核心技术卷一》、《Effective Java》、《深入理解Java虚拟机》、《Java8实战》和《Java高并发编程实战》对于掌握Java基础和高级概念非常有帮助。对于Java Web,推荐...
在Java编程中,Socket是进行网络通信的核心组件,尤其在构建多客户端并发聊天程序时,Socket扮演着至关重要的角色。本文将详细探讨基于JavaSocket的多客户端并发通信聊天程序的设计与实现。 1. **JavaSocket概述** ...
8. **高级专题**:研究并发编程、设计模式、数据结构与算法,以及Java 8及更高版本的新特性。 通过以上步骤,逐步建立起完整的Java知识体系,不断实践和领悟,才能真正达到“一通百通”的境界。在面对新的技术和...