runoob.com,多线程编程( 三 )


多线程可以用来在什么场景使用呢?1,密集型计算:将一个大任务进行拆分,使用多线程进行执行,假设从1加到100万,你单线程需要8分钟,然后你分为16个线程做计算(半分钟),加上汇总的时间和创建销毁线程的时间,不会超过一分钟,7分钟喝咖啡足够了吧 。下载大文件的时候拆分成几个小文件,充分利用带宽!2,异步调用:多线程和异步不是一个概念,但是异步一定是多线程的,如果是同步调用发生阻塞的时候,CPU资源就浪费了,但如果是异步,可以执行别的线程,提高CPU使用率!3,web容器技术:一个请求使用一个线程去处理(多数容器已弃用,改用netty架构,一个线程遍历连接,分发给线程池进行任务处理)4,线程池:例如数据库连接池,JAVA中的线程池等,线程池创建多个线程来处理数据,避免频繁创建线程的开销!5,批处理:用于多个batch任务可并行处理,batch任务中的job可并行处理的情况!可以说多线程代表着高效率的运行程序,所以有很大的理由学习好多线程!怎么学好多线程呢?①,明白计算机原理:多核CPU的运行方式,线程执行,什么时候容易阻塞,寄存器,内存(可对照理解JAVA内存模型)等!②,线程基本操作:线程的创建,实现,开始线程,掌握线程状态,线程中断,线程休眠与唤醒等!③,掌握多线程常用技术:线程池的几种创建方式,使用synchonize,读写锁等加锁操作,使用阻塞队列实现顺序执行,使用threadlocal实现线程本地变量,使用future实现异步回调,使用fork-join框架并行处理任务,JAVA8的并行流式处理也是不错的选择!④,学会抛弃多线程:netty使用网络IO多路复用避免多线程开销,redis使用单线程才能被作为分布式锁,全局唯一id生成的线程安全策略!不是说多线程复杂就不用,也不是说多线程高效就一定用,一切根据场景来定,多线程开发中的实际案例,可随时交流,更多的技术分享,敬请关注 。
多线程编程的时候,使用无锁结构会不会比有锁结构更加快?

runoob.com,多线程编程


这是毋庸置疑的,因为线程加锁其实是很吃资源的!我们都知道,多线程模型中,为了避免线程之间的数据互串,影响数据安全,都会在方法或者指定的操作上加锁,最原始的加锁方式就是synchronize,这在以前被称为重度锁,因为加锁是违背了多线程模型的效率的!加锁的原理是什么呢?以a=1;a=b+1为例,编译器编译的时候会在这段代码之前加上一个标志比如说lock,同时在这段代码的后面加上标志unlock,在代码运行期间,一个线程进入这段代码之后先把lock置为加锁位,然后下一个线程过来访问这段代码的时候,发现已经上锁,就只能阻塞等待,等到第一个线程执行完了,把状态改了,然后通知后面的线程去继续执行!当然这是最简化模型的锁,一般锁有读写锁,条件锁,自旋锁等会有不同的唤醒方式和不同的性能消耗!但无论如何,加锁都是在保证数据安全的条件下对多线程性能的污染!那么,怎么避免加锁的性能下降呢?1,从业务上避免大量锁结构的产生!2,使用threadlocal,这能保证每个线程中的数据不会互相污染!3,多读少写的情况,使用读写锁!4,自旋锁会对CPU形成挑战,虽然是线程占用时间很少的锁!5,锁的粒度尽量小:能在方法内的锁,就不要占用整个方法志在用通俗易懂的方式学习高新技术,更多的技术分享,会不定时更新,敬请关注 。
既然Python解释器是单线程的,还有进行多线程编程的必要吗?
谢小秘书邀请~~先简单的回答:有必要 。首先,线程消耗的是CPU资源如果一个单线程内处理的业务逻辑会占用100%的CPU资源,那么,上了多线程也是没有用的 。但这种情况很少,高CPU占用一般出现在内存计算场景下,或者不良代码中错误的死循环 。正常情况下,CPU占用大于80%就需要进行代码或设计的优化,或者服务器增加资源了 。

推荐阅读