JAVA并发编程(一)—基本概念和术语

关于并发的基本概念和术语

在学习java并发编程时候之前,我们必须要搞清楚一些基本概念和术语。

  • 1.并发和并行的区别
  • 2.线程和进程的区别
  • 3.阻塞和非阻塞
  • 4.死锁、饥饿
  • 5.原子性、可见性
  • 6.指令重排

1.并发和并行的区别

并发并行是一个非常容易混淆的概念,也是面试中面试官经常问到的问题,虽然两者都可以表示多个任务一块执行,但是侧重点不同。并行侧重多个任务在一段时间内同时执行,而并发侧重多个任务交替运行(系统一会儿运行任务1,一会儿运行2,一会儿又运行1,如此交替)。

2.线程和进程的区别

我相信经历过校招的同学10个里,起码9个被问到过这个问题。什么是进程?通俗一点讲,你的任务管理器里面的进程列表里的就是进程了。一个线程需要执行一系列的操作,这就要依赖线程了。也就是说进程好比一个老大,而线程则是他的马仔,帮他做各种坏事。
从计算机层面上讲,一个线程里有许多线程。进程间相互独立同一进程的各线程间共享;线程上下文切换比进程上下文切换要快得多。

3.阻塞和非阻塞

阻塞和非阻塞是对线程来说的,阻塞是指一个线程在运行过程中不是畅通无阻的,有时候后需要停下一段时间,就好比在北京早高峰开车上班,你总要堵车,非阻塞则相反。

4.死锁、饥饿

为了各线程有序的访问一个共享的变量,需要在变量上加锁。好比有10个人用厕所但是只有两个卫生间,需要取得对应的锁才可以顺利的使用。
死锁是指:小明取得了卫生间A的锁,用来洗澡,小张取得了卫生间B的锁用来洗衣服,此时小明想要获得B的锁去洗衣服,而小张也正好要获得A的锁去洗衣服,他们谁也不肯让步,都等待着对方的锁,就这样,两个人在各自的厕所里什么也干不成。
饥饿是指:剩下的8个人,他们拿不到卫生间A.B的锁,一直等待,等啊等啊。

5.原子性、可见性

原子性:原子代表了一种不可分割,原子性也就代表了线程的一个操作是不可中断的。比如常见的赋值操作,int i = 0(对于32位系统下的Long类型和Bouble类型除外),只需要一个计算机指令就可以完成。但是诸如 i++、i += 1都不是原子,i++在计算机需要三部才可以完成:
1.读取i的值
2.i加1
3.i写回内存

可见性:在多线程环境中,一个线程修改了一个共享变量A的数值,其他线程是否能立即知道。对于串行程序来说,这是毫无疑问肯定的。但是对于并行程序来说,这就不确定了。一个线程操作一个变量,并不是操作变量本身,而是变量的一个副本,对副本操作完了,再写回。所以,当一个某一个线程对变量进行操作时,其他线程已经对这个变量进行了修改。就好比我们现在看到的星星的样子是几十亿年以前的样子,说不定此时此刻这颗星星已经湮灭了。

6.指令重排

代码的执行,是靠着JVM对底层的硬件发送各种不同的指令完成的,但是底层硬件为了优化执行速度,使得代码执行的顺序和实际指令执行的顺序不一样。比如下面的两行代码:

int a = b + c;
int d = e - f;

计算机指令如下:
1.读取b的值
2.读取c的值
3.读取e的值
4.将b+c的值放入寄存器
5.读取f的值
6.将寄存器中b+c的赋给a
7.将e-f的值放入寄存器
8.将寄存器中e-f的赋给d

这就是指令的重排:代码顺序和指令顺序不同。至于为什么指令是这样排序的,大家可以自行网上搜索,这里不展开讨论。
但是有一些指令是不能重排的,否则会造成严重的后果,Happen-Before规则说明了指令不能重排的规则。对于Happen-Before规则,大家可以点击这篇博客。http://blog.csdn.net/u010031673/article/details/48153797

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值