Java并发问答集锦并发回答.docx
- 文档编号:7118998
- 上传时间:2023-01-19
- 格式:DOCX
- 页数:10
- 大小:92.28KB
Java并发问答集锦并发回答.docx
《Java并发问答集锦并发回答.docx》由会员分享,可在线阅读,更多相关《Java并发问答集锦并发回答.docx(10页珍藏版)》请在冰豆网上搜索。
Java并发问答集锦并发回答并发问答集锦并发回答实战Java高并发程序设计自上市以来,得到了Java并发学习爱好者的一致好评,有很多读者来信,葛一鸣老师也做了很多专业问答,现在摘记出来,希望大家在学习高并发的同时,能吸收大家的经验,兼容并包、集采众长,探索出自己的并发策略,也希望大家多多在QQ群397196583里交流,葛老师都会抽时间回答,群里的Java朋友也会群策群力!
1、服务器请求增多、服务器请求增多【问】经常碰到类似的面试题:
服务器同一时刻最多接收1000个请求,现在一下来了2000个,如何处理【葛】缓存可以使用一些过期机制,尽可能不要溢出。
还有就是可以使用类似软引用弱引用做不太重要的缓存。
【问】缓存区爆掉,怎么处理?
用什么样的抛弃策略?
【葛】可以用生产者消费者模式,先放在一个缓冲区中2、多线程额外开销、多线程额外开销【问】在一般的程序中,会使用多线程提高效率,应付高并发,但是,多线程会有额外的开销、锁、和一些其他的副作用,这样就会无形之中影响了高并发。
请问,在多线程、高并发直接如何权衡他们【葛】线程数量要合理。
减少线程之间的竞争,还有,就是可以使用无锁。
对于热点数据,还可以进行热点分离3、Java8并并发相关发相关【问】1、当下多核的服务器比比皆是,作为开发人员,从代码角度考虑,有什么需要的地方?
2、多核环境下多线程之间的锁问题处理与单核环境下的情况有何异同?
3、Java8中的更并发相关的改进,其优势体现在哪些地方?
【葛】代码层面的注意点太多,很难简短回答,实际上我的实战Java高并发程序设计全书都在试图回答这个问题。
单核没有正真的并发。
java8提供了一些性能更好的,为并发优化的工具类4、并发处理中锁的使用、并发处理中锁的使用【问】在并发处理中锁的使用有啥经验没有?
【葛】并发量很高的时候,需要尽可能优化,比如书中提到的,热点分离,无锁等技术手段。
5、阶段性高并发、阶段性高并发【问】如何才能应对阶段性高并发?
比如一般平时并发访问比较均衡,一到晚上8-12点并发量一下子翻了四五倍,这种情况要怎么应对?
【葛】系统的设计应该要可以承受压力峰值。
除了优化代码外,看看能不能把一些好时的操作在系统空闲时做掉,形成可用的缓存?
6、多线程额外开销、多线程额外开销【问】个人项目肯定要节省预算,在计算资源紧张的情况下如何利用服务器资源?
【葛】合理的使用线程。
这也是实战Java高并发程序设计试图回答的问题,比如,可以使用无锁,使用actor并发模型等。
如果有相关经验和心得,或是什么问题,欢迎加QQ群397196583。
7、有效利用服务器资源、有效利用服务器资源【问】针对现在多核大内存的硬件环境,java开发如何有效利用服务器资源【葛】合理使用多线程,缓存,是可以大幅度提高性能的8、高并发出现在那些应用场景、高并发出现在那些应用场景【问】高并发出现在那些应用场景?
在各场景中如何最简单的解决高并发问题(java代码本身或依靠其他组件)?
【葛】很多场景会使用多线程,比如http服务器处理用户请求的时候。
java内部就有不少方便使用的类。
书中都有非常详细的说明。
读书过程中有不明白的可以加群。
9、异步任务、异步任务【问】ExecutorService的submit一个异步任务,返回的Future去取返回值的时候是要阻塞的,那这种带有返回值的submit的应用场景是什么?
不是很明白它和直接在当前线程中去做这个任务在效果上有什么区别。
【葛】首先,这个时候真实的操作是在另外一个线程中的,其次,你可以不用马上get那个值,你可以先去做其它事情,然后需要的时候再来get。
这样中间的可能的等待时间就可以利用起来。
10、开启的最大线程数、开启的最大线程数【问】java环境下可以开启的最大线程数是怎么计算的?
【葛】狭义上说和Xss已经java应用可用的操作系统内存大小有关。
内存越大,可以开的线程越多,简单的理解可以认为你开一个线程需要Xss大小的空间。
至少需要Xss大小的空间,Xss是一个线程占的一部分。
11、ExecutorService【问】ExecutorService使用shutdown线程没有关闭,shutdownNow关闭了这是为啥【葛】shutdownNow很暴力。
在执行的线程会被强制杀死。
可能导致数据不一致。
shutdown不会马上杀死正在执行的线程(但是线程池不再接受新的任务)。
可以使用awaitTermination等待所有线程结束。
12、处理并发经验、处理并发经验【问】处理并发还没什么经验,要注意些什么【葛】线程安全是最重要的【Ambitor】然后再注意线程中制造的对象要及时让它GC,不然内存满了之后直接卡屎意思是不要出现产生的对象=回收的对象,或者产生太多的对象,比如你写了一个程序,需要大数据量的离线计算,如果你产生的对象快要溢出的时候,会触发GC,GC回收了大部分后的没多久你又产生了大量对象,频繁触发GC会导致你程序慢的屎,GC会stoptheworld,线程多了上下文切换开销也大。
13、成熟组件、成熟组件【问】请问高并发现在有哪些成熟组件?
高并发时数据库瓶颈如何处理?
【葛】JDK中的JUC就是非常成熟的组件应该首先了解他们14、线程池、线程池【问】最近在用线程池,在配制他的Rejectpolicy的时候感觉目前提供的的解决方案不是很好。
请问有其他的更优雅的方案吗?
【葛】任何系统都是有瓶颈的。
操作瓶颈需要拒绝。
但如果你不想拒绝,你可以使用生产者消费者模式,让多余任务堆积在内存中。
风险是,可能导致OOM15、Javaweb系统系统【问】1.web系统中高并发请求性能瓶颈是中间件的问题还是程序的问题(可以通过多线程解决吗?
)2.守护线程会影响性能吗?
【葛】系统瓶颈可能是多个方面的比如数据库网络IO磁盘IO等待。
这些问题不能通过多线程来解决。
所以要找到问题的根源再来解决问题。
但如果是因为多线程竞争导致系统问题,则可以通过书中提到的优化方法加以改善守护线程和普通线程一样,合理使用不会影响系统。
16、虚拟化、虚拟化【问】现在虚拟化这么流行,那么在Docker等虚拟化的环境中,如何能提高JAVA应用的性能,最大化的利用多核的计算资源?
【葛】这个和在物理机上是一样的。
都要注意CPU个数和内存数量。
分配合理的线程数量即可17、工具、工具【问】多线程程序是怎么调优与发现问题的【葛】可以使用jprofile等工具18、Kilim【问】协程不知道楼主在实际的工作中有没有用到,如果用到了,麻烦说出你们的使用场景与经历的各种坑。
【葛】Kilim感觉使用起来相对比较麻烦。
Akka的Actor模型可以关注。
19、处理事务和控制应用并发数、处理事务和控制应用并发数【问】在实际生产环境上,数据库事务锁和JAVA应用程序的高并发关系是很大的,要如何处理事务和控制应用并发数的关系?
【葛】同时访问数据库的线程数量需要控制在合理范围内。
其次,很多数据库访问可以做成缓冲,只有在必要时才需要查询数据库。
20、多线程额外开销、多线程额外开销【问】请问使用线程池的时候参数要依照哪些标准来定?
怎么知道应该设计多少个核心线程数呢?
【葛】理论上说N个cpu用N个线程性能是最好的(每个线程都能满载)。
但是实际上做不到。
因为你无法让每个线程都满载运行,执行中会有不少等待(比如IO等待),所以这个问题要看情况而定。
谢谢大家看完,对并发有兴趣的可以加群QQ397196583,或者购买葛老师的实战Java高并发程序设计一书。
放广告:
京东购买:
http:
/当当购买:
http:
/亚马逊购买:
http:
/21、哪里最需要处理高并发问题、哪里最需要处理高并发问题【问】javaweb项目,哪里最需要处理高并发问题,大数据的查询,高并发有什么好的解决方案【葛】查询大数据量的表格,需要考虑返回数据集大小问题,多用户访问同一个服务,例如写数据库,需要考虑线程,事务完整性等问题。
22、高并发对应的服务器配置、高并发对应的服务器配置【问】我想知道的是高并发对应的服务器配置应该是怎样的?
如1000并发,10000并发,100000并发如果做负载均衡,每台服务器最高并发多少比较合适?
如最高2000并发【葛】这个要看应用以及机器的配置,很难一概而论。
你可以计算一些session要占的内存大小,以及物理机器的内存,并且还要看看这些客户端的交互是否频繁,数据量是否大23、多线程、多线程【问】web开发中,如果要使用多线程的话,使用什么方案对性能方面比较好?
【葛】从系统出发的话,前端可以做一些负载均衡,使用多台服务器分担压力。
在web服务器和数据库之间合理使用缓存24、并发数怎么查看、并发数怎么查看【问】并发数怎么查看啊?
压力测试怎么做啊?
都看什么指标啊?
【葛】线程可以用jstack打印出来。
压力测试可以使用类似jmeter的软件做25、同步、同步【问】除了java自带的四种同步方法countdownlatch,cyclicbarrier,另外两个只能想到生产者消费者问题,其他情况只能依靠自己来使用锁,除了已经成型的问题类型(读者写者问题)之外,还有什么好的方法去保证锁的公平性和处理死锁问题(主要是线程不一定会立马被调度,时间上执行有问题)【葛】公平锁会有性能问题。
如果没有必要不要使用公平锁。
高并发场合可以尝试无锁,无锁天生对死锁免疫26、并发过程中同步、并发过程中同步【问】并发过程中同步是怎么解决的,用synchronized,lock,还是其他?
【葛】这些都是可用的方法Object.wait()notify()也是一种。
此外,还有就是信号量,无锁也是一种常用的方式。
实际上重入锁内部就是用的原子类27、协程机制、协程机制【问】高并发环境现在用的主要就是事件模型、消息机制,目前项目里面网络连接层用的是Netty,线程和消息使用Jetlang来实现,对书中Akka一节挺感兴趣的,其他还有关于JAVA8部分性能。
感觉,JAVA如果能引入协程机制,性能会不会有更大的提升。
这本书,看前几章节和目录,感觉不是那种忽悠人的、大篇理论的,挺好的。
【葛】协程本身并不能提高性能。
因为硬件性能是无法提高的。
它只是通过改进了并发模型,使用更小粒度的模型来实现并发,使得CPU的效率(这里指花在应用程序上的CPU时间/总CPU时间)提高。
如果不使用这种模型,那么CPU时间会有更多花在线程上下文切换中。
28、调整、调整jvm参数参数【问】如何调整jvm参数使得多线程支持更好,更快能是线程分布到多cpu上.【葛】线程的分布没有相关的jvm参数。
在windows下,任务管理器中,你可以为每一个进程分配给定个CPU。
29、线程工具类库、线程工具类库【问】有什么好用线程工具类库?
比如我要处理100个文件,能传入一个list,传一个回调类.就可以处理的,自动帮我分到多个线程【葛】可以关注一下java8的并行流30、Disruptor【问】Disruptor有哪些具体的使用场景吗?
【葛】高并发的场景,作为生产者消费者的一种实现31、应用程序员、应用程序员【问】请问高并发是不是只在相对比较底层的框架级Java代码中需要关注,对于上层使用框架的程序员来说要注意些什么地方,能不能介绍几个开发场景?
【葛】对于应用程序员来说,我觉得有2种情况需要关注多线程1.计算密集型任务,比如大矩阵相乘,可以使用多核提高性能2.业务模型需要,比如系统可能接受多个并发请求,那么自然需要多线程。
32、GPU【问】因为之前有接触过他们的超算大赛,想请问一下,java里面的高并发跟超算大赛里面的利用GPU加速,还有MIC加速有什么区别么?
【葛】GPU的并行度非常高,速度很快。
GPU核甚至可以达到128。
我认为是一种非常重要的发展方向。
但是Java目前无法使用并行GPU。
GPU编程有其他专门的框架。
33、并发编程语言、并发编程语言【问】目前并发编程语言很多,例如go,erlang,scala等,不知道老师对于这些编程语言有研究吗?
这些语言和Java比起来,有什么优缺点?
还有最近比较流行的Java函数式编程是并发的一种模式吗?
老师对于函数式编程有什么看法吗?
【葛】每种语言都有自己的特色。
Java之所以流行,我认为是因为Java是一种很简答的语言,所以适合大规模软件开发,并不是因为Java适合做并行程序。
我们需要根据自己的应用场景和程序员的技能来选择合适的语言和平台。
对于函数式编程,我认为目前他们只是面向对象的补充。
长不足以完全替代面向对象。
我认为在未来函数式编程可能会进一步发展,但替代面向对象,不太可能。
上个世纪60年代lisp语言就已经有了,它就是纯粹的面向函数,但是这么多年过去了,除了在一些特定的领域外,几乎看不到他们的踪迹。
从我的角度看,函数式编程可以大幅度减少代码行数,让代码更为简洁,但是每一行代码的信息密度也随之大幅提高。
对程序员的要求反而会更高。
34、处理高并发的方法、处理高并发的方法【问】我经历了几个公司,处理高并发的方法,一般有如下几种1:
CDN2:
动静分离3:
集群,使用nginx做负载均衡4:
缓存等等,请问,还有哪些简单的,效果明显的好方法【葛】主要就是这些了,但是本书主要介绍的是Java编程语言层面的技巧(比如锁优化,无锁,并行模式,Actor模型等),不是系统架构上的优化。
35、mysql数据库,如何应对高并发数据库,如何应对高并发【问】javaweb应用,使用mysql数据库,如何应对高并发,除了负载均衡,数据库怎样分库分表,需要建立sequceDB吗?
怎样设计sequenceDB的表?
是需要自己编写主键生成策略吗?
(用hibernate)。
查询策略应该怎样优化,分库分表后,应用数据源切换策略应该怎么弄?
【葛】如果真的涉及到分库,就目前来说,最好还是根据应用特点进行分库。
尚没有成熟被大规模认可的分库框架。
即使有,使用起来也有诸多限制,比如不支持join等待。
数据库【问】资源宝不分库,多个数据库的时候通过什么同步工具比较好呢?
应用存取数据策略怎么搞【葛】Mysql有自带的复制MasterSlave这种。
Oracle可以考虑GoldenGate36、多线程在什么场景下应该使用什么模型、多线程在什么场景下应该使用什么模型【问】请教多线程在什么场景下应该使用什么模型,请罗列。
多线程的线程个数怎么度量,怎么进行线程的健康检查,有什么好的工具?
【葛】比如计算密集型,大矩阵乘法,可以使用多线程,查找时,可以使用多线程查找提高效率。
此外,由于业务模型需要,也会有多个线程。
为每个线程分配不同的任务。
你可以使用jstackjprofile观察你的线程37、内存泄漏、内存泄漏【问】java开发的后台程序一定会存在内存泄漏么?
求给信心。
我自己也没见过内存泄漏的,只是听前辈们说,每隔一段时间就得重启。
【葛】理论上说java不会内存泄漏。
概率很小,除非遇到类似jdk6中String.substring()这样的bug。
你这里说的问题,很大可能是因为应用没有写好,有地方的资源可能没有释放,比如内存中明明不需要的数据没有清理,数据库或者网络连接没有关,或者文件没有关闭导致的。
38、数据库是高并发的关键点、数据库是高并发的关键点【问】以我在实际工作中的情况来说,数据库是高并发的关键点,只要是数据库这边没问题了,一般就没什么问题,请问,如何在java语言层面解决这个并发问题【葛】数据库层面的优化基本和java无关。
应用层可以多使用缓存。
数据库那边可以优化索引。
【问】高并发的话,数据库那块怎么解决,会堵塞【葛】高并发不考虑数据库。
如果是数据库的优化,需要当读对数据库调优。
一般可以使用缓存,避免过多访问数据库39、jvm【问】java是通过jvm来和系统底层通信的,那这样的话,项目的并发性能取决于系统和jvm这两个的瓶颈呢?
那么上层的java代码优化是不是必然有限呢,那样该如何着手呢?
【葛】jvm的线程基本上对应操作系统的线程。
关系在大多数系统中是一一对应的。
因此,对于开发来说,你可以简单的认为他们是同一套。
40、volatile【问】经常看到有些开源项目的变量是volatile的,请问,这个关键字在什么情况要用,哪些类型的变量,需要用volatile修饰【葛】一个变量在一个线程中修改,在另外一个线程中读取这个时候为了保证可见性需要使用41、总、总cpu核数核数【问】如何拿到总cpu核数,系统负载,能否可以做到根据机器负载,自动增减处理线程?
搂取系统信息有合适的框架吗?
【葛】线程分配在哪个CPU上,Java应用无法决定,由操作系统调度,系统有多少个CPUjava通过Runtime.getRuntime().availableProcessors();可以得到42、避免死锁、避免死锁【问】请问高并发下,锁机制该怎么设定,目前系统在并发上来后总是会出现死锁的现象【葛】避免死锁可以有以下策略:
1.使用无锁2.lock的时候设置timeout时间3,lock的时候相应中断,应用层发现死锁,马上中断线程43、权衡最佳并发数、权衡最佳并发数【问】我想请教一下,如何根据硬件情况来权衡最佳并发数,如一台服务器有32颗内核,128G内存,一般情况下什么样的利用率为最佳?
高峰情况下什么样的利用率为最佳?
另外,在java中,除了利用CPU做高并发,是否也可以利用GPU来做高并发,有相关的资料吗?
【葛】利用率当然是100%的最佳。
但是要用在刀刃上。
比如CPU利用率,应该尽量是用户CPU占用多,而不是系统占用多(比如上下文切换)。
GPU可以做并发,这方便我了解不多,但GPU是专用处理器,没有完整的CPU功能。
只能进行浮点计算44、数据库连接池、数据库连接池【问】如何合理的估算线程池大小?
(如JavaWeb中的数据库连接池)【葛】如果应用是计算密集型,那么线程池数量应该和CPU数量差不多。
如果是IO密集型,那么线程池数量可以多一点。
但数据库连接池不是线程池!
45、forkjoin【问】之前有个场景是需要多个线程执行完后,进行结果处理的,最后使用Callable和FutureTask实现。
本来还想用fork/join框架的,可能理解不深,没用上。
请问在什么场景下使用fork/join框架会比较合适?
【葛】forkjoin更倾向于一种并发的编程框架。
当你需要分解子任务,并且需要对子任务进行合并时。
而这些子任务需要多个线程处理。
这个时候可以用。
如果没有分解任务和合并任务的需要。
那么不需要使用46、如何做登录、如何做登录【问】高并发情况下,如何做登录,如果把用户数据放到缓存里面,又不太合适,命中率太低了,数据量也太大【葛】如果连用户登陆都有那么大的访问量。
是不是可以考虑在数据库做分库了。
谢谢大家看完,对并发有兴趣的可以加群QQ397196583,或者购买葛老师的实战Java高并发程序设计一书。
放广告:
京东购买:
http:
/当当购买:
http:
/亚马逊购买:
http:
/
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Java 并发 问答 集锦 回答