Java多线程并发最佳实践
使用本地变量
尽量使用本地变量,而不是创建一个类或实例的变量。
使用不可变类
String、Integer等。不可变类可以降低代码中需要的同步数量。
最小化锁的作用域范围:S=1/(1-a+a/n)
a:并行计算部分所占比例
n:并行处理结点个数
S:加速比
当1-a等于0时,没有串行只有并行,最大加速比 S=n
当a=0时,只有串行没有并行,最小加速比 S = 1
当n→∞时,极限加速比 s→ 1/(1-a)
例如,若串行代码占整个代码的25%,则并行处理的总体性能不可能超过4。
该公式称为:"阿姆达尔定律"或"安达尔定理"。
使用线程池的Executor,而不是直接new Thread 执行
创建一个线程的代价是昂贵的,如果要创建一个可伸缩的Java应用,那么你需要使用线程池。
宁可使用同步也不要使用线程的wait和notify
从Java1.5以后,增加了许多同步工具,如:CountDownLatch、CyclicBarrier、Semaphore等,应该优先使用这些同步工具。
使用BlockingQueue实现生产-消费模式
阻塞队列不仅可以处理单个生产、单个消费,也可以处理多个生产和消费。
使用并发集合而不是加了锁的同步集合
Java提供了下面几种并发集合框架:
ConcurrentHashMap、CopyOnWriteArrayList、CopyOnWriteArraySet、ConcurrentLinkedQueue 、ConcurrentLinkedDeque等(相关介绍请见Java 并发编程(九)并发集合框架)
使用Semaphore创建有界的访问
为了建立稳定可靠的系统,对于数据库、文件系统和socket等资源必须要做有机的访问,Semaphore可以限制这些资源开销的选择,Semaphore可以以最低的代价阻塞线程等待,可以通过Semaphore来控制同时访问指定资源的线程数。
宁可使用同步代码块,也不实用同步的方法
主要针对synchronized关键字。使用synchronized关键字同步代码块只会锁定一个对象,而不会将整个方法锁定。如果更改共同的变量或类的字段,首先应该选择的是原子型变量,然后使用volatile。如果需要互斥锁,可以考虑使用ReentrantLock。
避免使用静态变量
静态变量在并发执行环境下会制造很多问题,如果必须使用静态变量,那么优先是它成为final变量,如果用来保存集合collection,那么可以考虑使用只读集合,否则一定要做特别多的同步处理和并发处理操作。
Java多线程并发最佳实践的更多相关文章
- java并发编程笔记(九)——多线程并发最佳实践
		java并发编程笔记(九)--多线程并发最佳实践 使用本地变量 使用不可变类 最小化锁的作用域范围 使用线程池Executor,而不是直接new Thread执行 宁可使用同步也不要使用线程的wait ... 
- java多线程中最佳的实践方案是什么?
		java多线程中最佳的实践方案是什么? 给你的线程起个有意义的名字.这样可以方便找bug或追踪.OrderProcessor, QuoteProcessor or TradeProcessor 这种名 ... 
- Java多线程并发05——那么多的锁你都了解了吗
		在多线程或高并发情境中,经常会为了保证数据一致性,而引入锁机制,本文将为各位带来有关锁的基本概念讲解.关注我的公众号「Java面典」了解更多 Java 相关知识点. 根据锁的各种特性,可将锁分为以下几 ... 
- 结合异步模型,再次总结Netty多线程编码最佳实践
		更多技术分享可关注我 前言 本文重点总结Netty多线程的一些编码最佳实践和注意事项,并且顺便对Netty的线程调度模型,和异步模型做了一个汇总.原文:结合异步模型,再次总结Netty多线程编码最 ... 
- 使用DataStax Java驱动程序的最佳实践
		引言 如果您想开始建立自己的基于Cassandra的Java程序,欢迎! 也许您已经参加过我们精彩的DataStax Academy课程或开发者大会,又或者仔细阅读过Cassandra Java驱动的 ... 
- Java多线程-并发容器
		Java多线程-并发容器 在Java1.5之后,通过几个并发容器类来改进同步容器类,同步容器类是通过将容器的状态串行访问,从而实现它们的线程安全的,这样做会消弱了并发性,当多个线程并发的竞争容器锁的时 ... 
- paip.复制文件 文件操作 api的设计uapi java python php 最佳实践
		paip.复制文件 文件操作 api的设计uapi java python php 最佳实践 =====uapi copy() =====java的无,要自己写... ====php copy ... 
- Java 网络编程最佳实践(转载)
		http://yihongwei.com/2015/09/remoting-practice/ Java 网络编程最佳实践 Sep 10, 2015 | [Java, Network] 1. 通信层 ... 
- Rolling cURL: PHP并发最佳实践
		Rolling cURL: PHP并发最佳实践 在实际项目或者自己编写小工具(比如新闻聚合,商品价格监控,比价)的过程中, 通常需要从第3方网站或者API接口获取数据, 在需要处理1个URL队列时, ... 
随机推荐
- BZOJ5090 组题 BZOJ2017年11月月赛 二分答案 单调队列
			欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ5090 11月月赛A题 题意概括 给出n个数. 求连续区间(长度大于等于k)最大平均值. 题解 这题 ... 
- Mistwald POJ
			一开始看不出来是快速幂矩阵的题目 先要把整个地图离散化为1,2,3,4,.... 连成一个有向图 邻接矩阵的平方意为:假如a->b 且b->c 那么一次平方后 a->c ... 
- 【Java】 剑指offer(6) 重建二叉树
			本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的 ... 
- Java中九大内置对象
			1.Request对象 该对象封装了用户提交的信息,通过调用该对象相应的方法可以获取封装的信息,即使用该对象可以获取用户提交的信息. 当Request对象获取客户提交的汉字字符时,会出现乱码问题 ... 
- golang实现分布式缓存笔记(一)基于http的缓存服务
			目录 前言 cache 缓存服务接口 cache包实现 golang http包使用介绍 hello.go Redirect.go http-cache-server 实现 cacheHandler ... 
- 我的Java自学之路
			其实在转正之后我就想抽个时间好好的梳理一下我的 Java 上车之路 ,但是一直拖到现在 ,因为有学弟问到 ,所以也就给了我动力 .毕竟答应了人家的事要做到 . 首先要有相应的背景介绍 ,不然说个毛线啊 ... 
- Gradle 同步 已经开始 Gradle sync started
			Gradle 同步 已经开始 Gradle sync started 作者:韩梦飞沙 Author:han_meng_fei_sha 邮箱:313134555@qq.com E-mail: 31313 ... 
- loj#2574. 「TJOI2018」智力竞赛 (路径覆盖)
			目录 题目链接 题解 代码 题目链接 loj#2574. 「TJOI2018」智力竞赛 题解 就是求可重路径覆盖之后最大化剩余点的最小权值 二分答案后就是一个可重复路径覆盖 处理出可达点做二分图匹配就 ... 
- javascript鼠标滚动
			firefox使用DOMMouseScroll,其他浏览器使用mousewheel当滚动时获取wheelDelta值,firefox使用detail:值为下滚3上滚-3,其他浏览器使用wheelDel ... 
- linux 关于时间日期date
			一.查看和修改Linux的时区 1. 查看当前时区 命令 : "date -R" 2. 修改设置Linux服务器时区 方法 A 命令 : "tzselect" ... 
