1、课程三问 - 学前:
a、为什么需要多线程?
同一个进程内部可能存在多个不同的task,这些task需要共享进程的数据,但是这些task操作的数据又有一定的独立性,不需要多个task按照时许执行,因此就产生了线程的概念。b、多线程是什么
多线程是相对于进程说的,多个线程共同组成了进程,线程是进程的一个个粒度单元,他们彼此独立。c、多线程有什么优势、带来什么问题
1、优点
由于多线程之间不需要按照时许进行,所以多线程可以降低时间复杂度。支持并发编程。
2、缺点
线程安全问题、频繁的上下文切换。
2、学习中疑惑点:
a、线程是否是最小粒度?
b、频繁的上下文切换带来了什么问题?
c、多线程是否一定比进程快?
【多线程学习第一课】
文章图片
3、解惑:
a、线程是否是最小粒度?
答:后来想了想,这个问题还挺傻的。因为子线程也可以拥有自己的子线程,那线程应该是进程的最小粒度。上图三个线程共同组成了一个进程,Thread 1也可以有自己的子线程。b、频繁的上下文切换带来了什么问题?
答:如上图:1->2->3->4->5,描述了一个线程a切换到另外一个线程b的过程。如果两个线程共同访问了并修改了进程公共数据变量x,那在a修改了x变量后,还需要同步到b线程的私有缓存L1/L2。频繁的切换,这就带来了缓存一致性问题。同时切换是CPU内核的切换,也就带来了性能的消耗。所以上下文切换是一个拿性能换取时间的过程。c、多线程是否一定比进程快?
答:不是的,如果一个进程只有很少的进程数,那可能上下文切换的时间大于单线程执行的时间了。
4、总结:
a、多线程提高了多核cpu的利用率,同时带来了性能的消耗以及线程安全、资源竞争、死锁等问题。b、线程是cpu内核调度的最小单元。
推荐阅读
- 面试集锦专栏|【面试常问】线程中常用的方法
- Java|阿里内部流出热捧Spring全线笔记全家桶,太完整了。
- Android|Android全面解析之由浅及深Handler消息机制
- Linux|Linux生产者消费者模型
- Android|实例说明 Android 多线程、多进程与全局变量之间的关系
- 代码狂魔|实战证明java中的两把锁ReentrantLock与synchronized的系统调用
- 进程通信方式
- 解决方案|大文件拆分方案的java实践