一. 概念与基础
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多线程基础介绍,多线程设计模式详解,juc包内对象详解,作为自己学习的记录,持续更新中
编写正确的程序很难,而编写正确的并发程序则难上加难。与串行程序相比,在并发程序中...同时在当今互联网的时代,大量的互联网应用都面对着海量的访问请求,因此,并发编程在我们的应用中成为越来越不可或缺的一部分。
编写正确的程序很难,而编写正确的并发程序则难上加难。与串行程序相比,在并发程序中...同时在当今互联网的时代,大量的互联网应用都面对着海量的访问请求,因此,并发编程在我们的应用中成为越来越不可或缺的一部分。
这是本人自己总结的关于在Java面试中一些常见的并发编程问题。免费分享给大家,希望对你们有用。如果有写的不对的地方,敬请大佬斧正!
我会根据下图中的技能点持续更新原创内容,技能列举的可能不是很完善,朋友们可以去【公众号】或【微信】给我提意见!都到这了,点个【Star】防走丢哦!原创内容公众号【JavaQ】首发,关注不迷路。...高并发编程-Reent
多线程支持:Java内建对多线程编程的支持,使并发编程变得更加简单直接。 动态性:Java可以通过反射、注解等机制实现在运行时动态加载类和修改行为,增加了程序的灵活性。 综上所述,Java凭借其强大的特性和广泛...
DougLee可扩展的网络服务事件驱动Reactor模式基础版多线程版其他变体java.io包中分阻塞IOAPI一览Web服务器,分布式对象系统等等它们的共同特点Read请求解码请求报文业务处理编码响应报文发送响应实际应用中每一个...
一份通俗易懂、风趣幽默的Java学习指南,内容涵盖Java基础、Java并发编程、Java虚拟机、Java企业级开发、Java面试等核心知识点。学Java,就认准Java 程序员进阶之路
技术职业生涯,持续学习提高 学习目标: 夯实Java基础,掌握核心概念和原理 深入理解JVM内存模型、垃圾收集等底层知识 熟悉主流框架的设计思想和运行原理 掌握数据库、缓存、分布式系统等企业级开发技能 拓展视野,了解...
多线程支持:Java内建对多线程编程的支持,使并发编程变得更加简单直接。 动态性:Java可以通过反射、注解等机制实现在运行时动态加载类和修改行为,增加了程序的灵活性。 综上所述,Java凭借其强大的特性和广泛...
多线程支持:Java内建对多线程编程的支持,使并发编程变得更加简单直接。 动态性:Java可以通过反射、注解等机制实现在运行时动态加载类和修改行为,增加了程序的灵活性。 综上所述,Java凭借其强大的特性和广泛...
多线程支持:Java内建对多线程编程的支持,使并发编程变得更加简单直接。 动态性:Java可以通过反射、注解等机制实现在运行时动态加载类和修改行为,增加了程序的灵活性。 综上所述,Java凭借其强大的特性和广泛...
多线程支持:Java内建对多线程编程的支持,使并发编程变得更加简单直接。 动态性:Java可以通过反射、注解等机制实现在运行时动态加载类和修改行为,增加了程序的灵活性。 综上所述,Java凭借其强大的特性和广泛...
并发编程 框架 Spring SpringBoot 数据库 安全 分布式 微服务 Spring Cloud Dubbo 架构设计 场景设计 缓存 网络 网络学习资源 性能调优 性能调优学习资源 Tomcat 面试题 互联网大厂面试题 技术博客:IT宅 关注公众号...
本藏馆主要珍藏Java体系核心技术书籍: (,,)(,,,,,) 上古单体时代 分布式朝代 微服务纪元 云原生前沿 DevOps 软件工程思想 编码艺术Java核心基石java技术基本功并发编程JVM专栏篇1.Java调优实战 so easy~...
多线程支持:Java内建对多线程编程的支持,使并发编程变得更加简单直接。 动态性:Java可以通过反射、注解等机制实现在运行时动态加载类和修改行为,增加了程序的灵活性。 综上所述,Java凭借其强大的特性和广泛...
面试必备,java基础、java集合、JVM、Java并发、数据结构与算法、LeetCode、剑指offer、计算机网络、设计模式、MySQL、Redis Java是一种广泛使用的面向对象的编程语言,由Sun Microsystems公司于1995年5月正式发布...
多线程支持:Java内建对多线程编程的支持,使并发编程变得更加简单直接。 动态性:Java可以通过反射、注解等机制实现在运行时动态加载类和修改行为,增加了程序的灵活性。 综上所述,Java凭借其强大的特性和广泛...
多线程支持:Java内建对多线程编程的支持,使并发编程变得更加简单直接。 动态性:Java可以通过反射、注解等机制实现在运行时动态加载类和修改行为,增加了程序的灵活性。 综上所述,Java凭借其强大的特性和广泛...
多线程支持:Java内建对多线程编程的支持,使并发编程变得更加简单直接。 动态性:Java可以通过反射、注解等机制实现在运行时动态加载类和修改行为,增加了程序的灵活性。 综上所述,Java凭借其强大的特性和广泛的...