摘要:前言并发编程的目的是让程序跑的更快,但并不是启动更多的线程,这个程序就跑的更快。尽可能降低上下文切换的次数,有助于提高并发效率。死锁并发编程中的另一挑战是死锁,会造成系统功能不可用。
前言
并发编程的目的是让程序跑的更快,但并不是启动更多的线程,这个程序就跑的更快。有以下几种挑战。
挑战及方案 上下文切换单核CPU上执行多线程任务,通过给每个线程分配CPU时间片的方式来实现这个机制。时间片是CPU分配给每个线程运行的时间,时间片非常短,CPU通过不断的切换线程执行,给我们人类留下的印象就是多个线程在同时执行。
由于线程有创建和上下文切换的开销,当整个程序内部操作数不高的情况下,并发执行可能比串行执行来的慢。
尽可能降低上下文切换的次数,有助于提高并发效率。
无锁并发编程。书中提到多线程竞争锁时会发生上下文切换,所以竟可能避免使用锁==书中指的应该是为了竞争锁而触发的抢占式上下文切换,因为日常多线程运行也需要上下文切换==,可以通过不同线程处理不同分段的数据来降低。
CAS算法。Java中的Atomic包使用CAS算法来更新数据,不需要加锁==CAS算法目前还不是很了解==
使用最少线程。
协程。协程,又称微线程,纤程。英文名Coroutine。指的是在单线程里面实现多任务的调度==之前在Python和Go里面听过这个概念,不过还没做具体了解。==
死锁并发编程中的另一挑战是死锁,会造成系统功能不可用。死锁是指两个或两个以上的进程或者线程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象。
避免死锁的常见方法:
避免一个线程同时获取多个锁。
尽可能保证一个锁内只占有一个资源。
尝试使用定时锁。
资源限制的挑战比如说带宽只有2Mb/s,你下载速度是1Mb/s,开10个线程速度也不会变成10Mb/s。书中提到在并发编程时需要考虑到资源上的限制。如果受制于资源,比如我数据库连接数就10个,你每次用完都新建线程来做连接,整体程序的速度肯定会慢下来。
解决的方法有以下几点:
对于硬件资源的限制,可以使用集群来跑。
对于软件资源上的限制,可以复用资源,比如复用数据库连接。
根据资源的限制,灵活的去调整并发度。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/70295.html
摘要:目前看的部分主要是这个关键字。语言提供了,保证了所有线程能看到共享变量最新的值。前缀的指令在多核处理器下会做两件事情将当前处理器缓存行的数据写回到系统内存。 这一章节的话,主要是讲一下在并发操作中常见的volatile、synchronized以及原子操作的相关知识。 目前看的部分主要是volatile这个关键字。 volatile 根据Java语言规范第3版中对volatile的定义...
摘要:前言今天的笔记来了解一下原子操作以及中如何实现原子操作。概念原子本意是不能被进一步分割的最小粒子,而原子操作意为不可被中断的一个或一系列操作。处理器实现原子操作处理器会保证基本内存操作的原子性。 showImg(https://segmentfault.com/img/bVVIRA?w=1242&h=536); 前言 今天的笔记来了解一下原子操作以及Java中如何实现原子操作。 概念 ...
摘要:在之前的文章中学习了关键字,可以保证变量在线程间的可见性,但他不能真正的保证线程安全。线程执行到指令时,将会尝试获取对象所对应的的所有权,即尝试获得对象的锁。从可见性上来说,线程通过持有锁的方式获取变量的最新值。 在之前的文章中学习了volatile关键字,volatile可以保证变量在线程间的可见性,但他不能真正的保证线程安全。 /** * @author cenkailun *...
摘要:开头正式开启我入职的里程,现在已是工作了一个星期了,这个星期算是我入职的过渡期,算是知道了学校生活和工作的差距了,总之,尽快习惯这种生活吧。当时是看的廖雪峰的博客自己也用做爬虫写过几篇博客,不过有些是在前人的基础上写的。 showImg(https://segmentfault.com/img/remote/1460000010867984); 开头 2017.08.21 正式开启我...
阅读 2704·2021-11-19 09:40
阅读 5225·2021-09-27 14:10
阅读 2065·2021-09-04 16:45
阅读 1334·2021-07-25 21:37
阅读 2963·2019-08-30 10:57
阅读 2904·2019-08-28 17:59
阅读 1025·2019-08-26 13:46
阅读 1376·2019-08-26 13:27