Java并发编程基础

Java并发编程基础笔记(一)

基础回顾

单个CPU是如何同时进行多任务的?
小明同时打着LOL, 听着音乐,一边还跟人聊天。
在任一单一时刻, CPU都只在干一件事情,但游戏、音乐、聊天有大量的IO操作, CPU只要把数据给到IO设备, 就可以腾出手来做别的。因为CPU的速度非常快,它的处理时间分成一个个很小的时间片, 在不同的任务之间切换,从宏观上面来看就好像是多个任务同时在进行。

IO是如何完成的?

  1. 显卡、声卡、网卡这些IO设备,与CPU之间通过数据缓存来通信
  2. 放歌的时候,cpu把音乐解码后的数据发送给声卡
  3. 玩游戏的时候,cpu把需要在屏幕上展现的数据交给显卡来处理
  4. 聊天的时候,cpu从网卡读取通信数据,出来后又交给网卡

多任务操作系统的核心原理:时间片轮转与异步IO

并发与并行

并行与并发的区别与联系
并发(Concurrent)
是指多个事件在同一时间间隔内发生。
并发指的是多个任务在同一时间间隔内得到执行,但是实际上任何一个单一时刻又只有一个任务在执行。
并行(Parallel)
是指多个事件在同一时刻发生。
而并行指的是多个事件在同一时刻发生,并行一定是有多个处理器的情况 。

并发与并行使用得当,都能提升程序的性能。
并发的场景更多与IO相关。
如果所有的任务都是纯计算型任务?
GUI的例子,单独的UI线程使得用户响应得到保证。
同时多个IO的场景如多线程网页抓取,并发提升总吞吐。
并行则更多是利用多CPU或GPU的性能。

同步与异步

讨论同步和异步,必然涉及到多个部件的协作

同步(Sync)
所谓同步,就是调用一个功能,在没有得到结果之前,该调用就不继续执行后续操作。 根据这个定义,Java中所有方法都是同步调用,因为必须要等到结果后才会继续执行。
在这里插入图片描述

异步(Async)
异步与同步相对,当一个异步过程调用发出后,调用者在没有得到结果之前,就可以继续执行后续操作。当这个调用完成后,一般通过状态、通知和回调来通知调用者。对于异步调用,调用的返回并不受调用者控制
在这里插入图片描述

进程与线程

在这里插入图片描述

一个应用程序可以对应多个进程,而一个进程又可以包含多个线程。 比如左图中的System进程就有190个线程。

进程与线程的关系(一)
在这里插入图片描述

如进程与线程关系的示例, 存储在硬盘上的程序,被执行后可能会生成一个或多个进程,而每个进程内部又有一个或多个线程。其中,如果在电脑里打开多个记事本,其实就是创建了多个进程,多个实例。

所以进程是应用程序在执行时的一个实例。而线程,则是进程中独立的执行单元。

比如你玩LOL,系统中会有一个LOL进程,而这个进程可能同时会有好多线程,一些负责播放游戏中的各种声音,一些负责处理键盘和鼠标的输入,一些又负责网络通信,CPU在这些线程之间轮转,让这些线程一起分工协作,完成让你玩游戏的任务。

进程与线程的关系(二)
画出进程与线程的关系
在这里插入图片描述
这是Java中进程与线程关系的图解,我们可以看到不同的线程对堆和方法区是共享的, 而每一个线程自己独立的虚拟机栈、本地方法栈与程序计数器。

为什么程序计数器必须私有
为什么栈必须私有

首先看看程序计数器,它主要有下面两个作用:
JVM通过改变程序计数器来依次读取指令,从而实现代码的流程控制,如:顺序执行、选择、循环、异常处理。
在多线程的情况下,程序计数器用于记录当前线程执行的位置,从而当线程被切换回来的时候能够知道该线程上次运行到哪儿了。

虚拟机栈: 每个 Java 方法在执行的同时会创建一个栈帧用于存储局部变量表、操作数栈、常量池引用等信息。从方法调用直至执行完成的过程,就对应着一个栈帧在 Java 虚拟机栈中入栈和出栈的过程。

本地方法栈: 和虚拟机栈所发挥的作用非常相似,区别是: 虚拟机栈为虚拟机执行 Java 方法 (也就是字节码)服务,而本地方法栈则为虚拟机使用到的 Native 方法服务。

所以,为了保证线程中的局部变量不被别的线程访问到,虚拟机栈和本地方法栈是线程私有的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值