同步的英文单词是synchronization,异步的英文单词是asynchronization,两者的区别仅仅是异步多了一个字母A,而且还放在首字母。很多毕业生匪夷所思啊,这两个单词都能搞混掉了。计算机专业上的同步和异步基本都是这两个词,大都数语言的关键字也是这两个,甚至于所有的第三方库也是这两个关键词。技术强是一方面,但是良好的素养会赢得更多人的钦佩。
同步就是协同步调,按预定的先后次序进行运行。你可以理解为排队买票的时候不允许有其他人插队,必须得一个个买完票。而更精准的理解是协同,线程A和B一块配合,A执行要依靠B的某个结果,于是停下来,示意B运行;B依言执行,再将结果给A;A再继续操作。
首先,理解一下什么是线程通信。线程通信是同一个进程的多个子线程之间的通信。因为所有线程共享一个进程资源,所以就存在线程安全问题。所以如果有面试题目问你什么是线程安全问题,你可以回答多个线程同时共享一个全局变量或者静态变量,做写的操作时会发生数据冲突,也就是线程安全问题。
以下为单个进程下多线程地址空间分布图。
其次,理解一下多线程之间同步以及线程安全解决办法。
线程同步是指当多个线程共享同一个资源,不会受到其他线程的干扰。
线程安全解决办法就是使用线程同步或者说线程锁。当然锁机制包括互斥锁、条件变量、读写锁和自旋锁。这个你就得背一下了,面试官可能不会问你,但是举个例子让你答哪一种机制会好。
线程锁是在数据发生冲突的代码块,限制只能当前一个线程执行,代码执行完成后释放锁,让下一个线程来执行。当然这就引申出另外一个问题就是线程死锁问题,同步中嵌套同步,导致锁无法释放。这个如果讨论起来就有点复杂了,所以言简意赅即可。
最后是多线程同步的方式和机制(此为windows平台下经常作为面试题目,最好背下来)
临界区:不可以跨进程,忘记解锁会无限等待,要么存在要么没有,多线程访问独占性共享资源。此为效率最高,而为什么是效率最高,字节面试的时候就问了这个问题。临界区的效率最高是因为它不用陷入内核,而下面三种方式是系统内核对象,效率比临界区低,但是有更好的可操作性。
互斥量:可以跨进程,忘记解锁会自动释放,要么存在要么没有。
事件:又叫线程触发器,不可以跨进程,要么存在要么没有,一个线程来唤醒另一个线程(包括自动和人工两种方式)。
信号量:可以跨进程,始终代表可用资源数量,当资源数为o时,线程阻塞,允许多个线程同时访问一个共享资源。
当然如果你要寻求更高效的同步方式,应该用原子锁,原子锁的效率是临界区的5倍左右(感兴趣的可以自己测试)。
有时候接触的不多,是很难能够详细的去阐述的。面试又要我们像造火箭那般,把所有的工序流程完整的表达出来,当然如果你有雄厚的基础,有写过代码会好。如果没有,我觉得多看书,扎实一下理论基础,同样可以征服考官。看书不仅仅是写代码的需要,同样是在处于知识层面上的宽度和广度,有助于技术选型以及架构处理,走的更远。
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.