文档章节

多线程的挑战

learn_more
 learn_more
发布于 2016/08/27 09:50
字数 560
阅读 49
收藏 0

1、并发不一定会快于串行,因为并发受限于很多因素,这些因素主要有:上下文切换,死锁,硬件资源(CPU核心数),软件资源(锁的数量)。

2、单核处理器同样可以运行多线程,这个时候CPU通过给每个线程分配CPU时间片来实现这个机制,因为时间片非常短,所以线程之间的切换是宏观无法感知,微观上来讲还是串行的,这就是宏观并行,微观串行。如果线程数远远大于CPU核心数,那么不同的线程与线程之间需要相互切换来获取CPU资源,所以这是非常耗时的,因此资源受限的情况,并行并不一定由于串行。

3、测试上下文切换可使用 Lmbench3 vmstat jstack 等工具命令查看。

4、减少上下文切换可以通过 无锁并发编程,CAS算法,使用最少线程(这个很难衡量,只是一个相对概念,因为线程太多,资源太少,导致大量线程等待,性能反而不乐观)。

5、死锁导致并发程序出现不可用。两个线程t1,t2,程序运行时t1拥有锁1,与此同时,t2拥有锁2,这个时候t1想要继续运行并且想要获取锁2,那么t1必须等待t2释放锁2,可是t2线程也正需要获取锁1线程才能运行完,那么t2就要等等t1释放锁1.这样t1和t2相互等待,形成死锁。

6、避免死锁的几种方法:

1)避免在一个线程内同时获取多个锁

2)避免一个线程在锁内同时还去占用其他锁

3)尽量使用定时锁,lock.tryLock(timeout) ,超时之后自动释放锁,根据业务决定

7、其他硬件和软件资源的限制

1)多线程下载也会受到宽带大小的限制

2)IO读写速度

3)数据库连接数,Socket连接数等,受限的资源也是影响并发的一个因素。

© 著作权归作者所有

下一篇: 吐槽OSC
learn_more
粉丝 93
博文 240
码字总数 210196
作品 0
深圳
程序员
私信 提问
1、Java并发性和多线程-并发性和多线程介绍

以下内容转自http://ifeve.com/java-concurrency-thread/: 在过去单CPU时代,单任务在一个时间点只能执行单一程序。之后发展到多任务阶段,计算机能在同一时间点并行执行多任务或多进程。虽...

easonjim
2017/06/14
0
0
【Java并发性和多线程】Java并发性和多线程介绍

本文为转载学习 原文链接:http://tutorials.jenkov.com/java-concurrency/index.html 译文链接:http://ifeve.com/java-concurrency-thread/ 在过去单CPU时代,单任务在一个时间点只能执行单...

heroShane
2014/01/28
171
0
菜鸟学Linux 第105篇笔记 海量存储解决

菜鸟学Linux 第105篇笔记 海量存储解决 内容总览 大数据带来的挑战 传统存储SAN 分布式存储 多线程与进程执行模式 计算机五大部件变化 分布式系统的难点 分布式文件系统设计目标 分布式事务的...

Winthcloud
2017/02/23
0
0
Java大佬带你详细了解,线程的应用及挑战

文章简介 上一篇文章我们了解了进程和线程的发展历史、线程的生命周期、线程的优势和使用场景,这一篇,我们从Java层面更进一步了解线程的使用 内容导航 并发编程的挑战 线程在Java中的使用 ...

Java-飞鱼
06/25
66
0
【阿里面试系列】Java线程的应用及挑战

文章简介 上一篇文章【「阿里面试系列」搞懂并发编程,轻松应对80%的面试场景】我们了解了进程和线程的发展历史、线程的生命周期、线程的优势和使用场景,这一篇,我们从Java层面更进一步了解...

Java架构资源分享
2018/12/07
113
0

没有更多内容

加载失败,请刷新页面

加载更多

centos 查看删除旧内核

1、查看系统中安装的内核 $ yum list installed | grep kernel 2、删除系统中旧内核 $ yum install yum-utils$ package-cleanup --oldkernels --count=2...

编程老陆
4分钟前
0
0
ES6

ES6:不改变原理的基础上,让API变得更简单 一、let:代替var用于声明变量 1、var的缺点: (1)声明提前 (2)没有块级作用域 2、let的优点: (1)组织了申明提前 (2)让let所在的块({}),...

wytao1995
今天
3
0
kubernetes 环境搭建 —— minikube

创建集群 minikube start 搭建好 k8s 集群后,可以查看集群的状态以及部署应用。主要用到的是 k8s 的 api,这通常需借助于 kutectl 命令行工具 基本操作 kubectl versionkubectl cluster-i...

lemos
今天
9
0
关于js混淆与反混淆还原操作

使用js的混淆加密,其目的是为了保护我们的前端代码逻辑,对应一些搞技术吃饭的公司来说,为了防止被竞争对手抓取或使用自己的代码,就会考虑如何加密,或者混淆js来达到代码保护。 1、为什么...

开源oschina
今天
11
0
用盛金公式解三次方程(ansi c版)

/* cc cubic.c -lm gcc cubic.c -lm Shengjin's Formulas Univariate cubic equation aX ^ 3 + bX ^ 2 + cX + d = 0, (a, b, c, d < R, and a!= 0). Multiple root disc......

wangxuwei
今天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部