10.1 并发(Concurrency)

10.1 并发(Concurrency)

1.什么是并发编程(Concurrent Programming)

2.进程,线程和时间切片  Processes,threads,and time-slicing

3.相互交错和竞争(Interleaving and Race Condition)

 (1) Time slicing 时间切片

 (2) Shared Memory among Threads 线程共享内存

 (3) Race Condition 竞争条件

 (4) Message Passing Example 信息传递实例

 (5) Concurrency is hard to test and debug 并发很难测试和调试

(6) Some operations for interfering automatic interleaving of threads 一些干涉的操作

 

 

1.什么是并发编程

1)并发:同时进行多个计算

 

2)例子:网络上的多台计算机;一台计算机上的多个应用;一个CPU上的多核处理器;

多用户并发请求服务器的计算资源;App在手机端和在云端都有计算;

GUI前段操作和后台计算

 

3)并发原因:摩尔定律失效,充分利用处理器

4)并发模块:共享内存,在内存中读写共享数据;消息传递,通过channe(网络)交换消息

 

2.进程,线程,时间切片

并发模块的类型:进程(私有空间,彼此隔离)和线程(程序内部控制)

(1)进程

进程拥有整台计算机资源,进程==程序

多进程之间不共享内存

进程通过消息传递进行协作(IPC机制进行进程通信)

JVM通常运行单一进程,但也可创建进程

 

(2)线程

进程=虚拟机;线程=虚拟CPU(共享内存,创建消息队列进行消息传递)

在多个处理器运行,GC在一个自己的线程运行

 

 

 

(3)在JAVA中创建线程

每个应用至少一个线程(主线程)

方法1:从Thread派生子类

 

方法2:从Runnable接口构造Thread对象

 

 

一个常用方法,创建匿名Runnable,消灭类名

 

 

 

PS:只有调用start时,线程才开始

 

3.交错和竞争

(1)time-slicing 时间分片

同一时刻只能执行一个线程,通过时间分片,在多个进程/线程间共享处理器,这是由OS自动调度的

(2)线程间共享内存

处理器每次执行一个原子语句

语句将细分为取值,操作,写回三个操作

是否原子由JVM决定,我们无法判断

(3)竞争

程序正确性取决A与B语句执行的某种时间顺序,则A与B是竞争的

(4)信息传递

信息传递无法解决竞争问题,信息传递时也可能出现竞争

(5)并发难测试和调试

很难复现BUG

(6)利用某些方法调用来主动影响线程之间的交错关系

1)Thread.sleep(time)线程休眠

将某个线程休眠使其他线程得到更多机会,PS:线程休眠不会失去对现有锁的所有权

2)Thread.interrupt()线程中断信号

 t.interrupt()在其他线程里向 t 发出中断信号

 t.isInterrupted() 检查 t 是否已在中断状态中

 

 

只有当线程休眠时才会检测是否收到中断信号,然后再异常处理catch中进行相应的处理

 

直接抛出异常也可以

 

 

3)Thread.yield()

尽量避免使用

告诉处理器放弃对CPU的占用

4)Thread.join()

让当前线程保持执行,直到执行结束,该操作也会检测中断信号

 

 

猜你喜欢

转载自blog.csdn.net/qq_42766619/article/details/90631730