并发:
网络上的多台计算机
一台计算机上的多个应用
一个CPU上的多核处理器
多用户并发请求服务器的计算资源
APP在手机端和在云端都有计算
GUI的前端用户操作和后台的计算同时进行
为什么要并发:
摩尔定律失效了
“核”变得越来越多
为了充分利用多核和多处理器,需要将程序转化为并行程序
共享内存:并发模块在内存中读写共享数据
消息传递:并发模块通过channel交换信息
共享内存:
两个处理器,共享内存
同一台机器上的两个程序,共享文件系统
同一个Java程序内的两个线程,共享Java对象
消息传递:
网络上的两台计算机,通过网络连接通讯
浏览器和Web服务器,A请求页面,B发送页面数据给A
及时通讯软件的客户端和服务器
同一台计算机上的两个程序,,通过管道连接进行通讯
并发模块的类型:进程和线程
进程:私有空间,彼此隔离
线程:程序内部的控制机制
进程:拥有整台计算机的资源
多进程之间不共享内存
进程之间通过消息传递进行协作
一般来说,进程==程序==应用
但一个应用可能包含多个进程
OS支持IPC机制(pipe/socket)支持远程间通信
不仅是本机的多个进程之间,也可以是不同的机器多个进程之间
进程=虚拟机,线程=虚拟CPU
程序共享、资源共享、都隶属于进程
每个应用至少有一个进程
主线程:可以创建其他的线程
匿名类:
优点:
明确了使用范围
读者不需要寻找定义类
缺点:
不能复用
代码过长时,影响理解
匿名类多用于短的一次性的方法实现
交错和竞争:
虽然有多线程,但在只有一个核的计算中,每个时刻只能执行一个线程
通过时间分片,在多个进程/线程之间共享处理器
即使是多核CPU,进程/线程的数目也往往大于核的数目
时间分片是由OS自动调度的
关键点:不能通过查看一个表达式来判断他是否在竞争条件下是安全的
“Thread Interference”线程干扰
消息传递机制也无法解决竞争条件问题
很难测试和调试是因为竞争条件导致的bug
因为interleaving的存在,导致很难复现bug
Thread.sleep(time)线程的休眠
将某个线程休眠,意味着其他线程得到更多的执行机会
进入休眠的线程不会数去对现有monitor或锁的所有特权,从休眠中苏醒后可以继续执行
interrupt()向线程发出中断信号
t.interrupt()其他线程向t发出中断信号
t.interrupt()执行后,t的中断状态设置为true
t.isInterrupted()检查t是否已在中断状态中,只是查询,不改变状态
Thread.Interrupted()检查当前线程是否已在中断状态中,并重置状态为false
注意:interrupt()和isInterrupt()是实例方法,interrupted()是类方法
Thread.join()让当前线程保持执行,直到其执行结束