并发编程必要要懂的概念和思想

并发编程必要要懂的概念和思想

2018年06月03日 09:57:10 TaurusMG 阅读数:266

其实并发编程并没有我们想的那么难,很多的时候我们在思考的时候是因为没有get到并发编程的点,很多时候我们都是稀里糊涂的去学习并发编程的,根本很难弄明白并发编程要注意什么,在这个期间我觉得自己走了很多的弯路,现在分享一下我对于并发编程的一些理解:

(1)为什么需要采用并发编程,并发编程需要解决的问题的本意是什么?

我自己的理解是并发编程的目的是为了提高系统的性能,当流量足够大的时候我们的系统仍然可以较为稳定的运行。

(2)知道并发编程要解决的问题之后,我觉得还要提出一个疑问就是,并发编程跟我们平常编程有什么区别?

一开始我觉得并发编程是属于很高级的东西,好像很难懂和理解,然后就选择对他避而不见,以为这个是个难挑的刺,但是最后无奈,静下心来学习的时候才发现我以前的想法错了,其实并发编程跟我们普通的编程是一样的,只不过我们需要对我们的程序结果要更加的清楚而已。

(3)那么并发编程跟平常的编程的不同之处在哪?

我曾经为了了解掌握并发编程,我也很认真的去买书看,到处看别人的博文,自以为对并发编程很了解,但事实并非如此,我根本就没有理解,我只是死记硬背了书上的内容而已,遇到问题总是一知半解。

经过了很久,我才发现处理并发编程的问题,有几个共性,或者说是关键的地方,那就是怎么样才能确保并发的安全性,发现无非是这三个方面:

(1)原子性 (2)可见性 (3)有序性

 

带着问题去思考问题是最好的,进行并发编程的时候我们清楚的记住这3个地方就可以了

(1)什么是原子性?编程的时候怎么确保原子性?

原子性:即一个操作或者多个操作,要么顺利的执行(这里的顺利指的是这个过程不能被打断),要么不执行。

或许很多人都听过了这个定义,就好比道理我都懂,但是我就是想不明白啊!其实我们更多的是不明白在Java中什么样的操作是原子性的,知道了这个,一切就好办了。

我们必须要记住的是:在Java中,对基本数据类型变量的读取和赋值操作是原子性操作。

这句话很短也很简单,但是想要理解起来却不是那么容易的,哈哈

(1)什么是基本类型?

(2)读取和赋值

第一个很简答,不知道的话就要认真的学习下基础,关键是第二个,我觉得这个可以简单的理解为一步操作。

x = 10;

y = x;

x++;

x = x+1;

上面这几个都是我们经常会用到的,但哪些是原子操作的呢?

其实上面只有 x = 10;这个是属于院子操作的,其他的都不是,y = x;这个是赋值,但是是分了两布的,首先要从主存中读取x的值,然后再把值赋值给y,下面的两个也是这个道理。所以我们在写并发程序的时候必须要清楚的明白我们每一行代码的结果是不是保证了原子性,那么其他的三个操作我们怎么保证原子性呢?可以使用原子类,也可以使用同步,或者加锁的方式。知道了这些我们是不是要补补原子类,同步,锁的知识?

(2)可见性---怎么保证可见性呢?

首先一样我们要明白可见性的含义,其实很简单,就是我们每一个操作都要需要被其他的线程所知道,跟我们今天共享的概念有点一下。

Java中怎么保证可见性呢?这个时候就需要有一个清晰的认识,有一个关键字volatile,对于这个的理解就很重要了,在多个线程访问变量,改变变量的值的时候,我们就要思考一下,我们的线程执行的每一步操作,得到的结果对于其他的线程是不是可见的。

另外,通过synchronized和Lock也能够保证可见性,synchronized和Lock能保证同一时刻只有一个线程获取锁然后执行同步代码,并且在释放锁之前会将对变量的修改刷新到主存当中。因此可以保证可见性。

(3)有序性

这里说的有序性是对于程序执行的步骤来说的,以前我以为有序性,就是程序的代码的先后顺序,其实真的是对于JMM的理解不够深入,或者根本就没有理解好,在Java的内存模型中是允许编译器和处理器对于指令进行重排序的,这个的目的是为了优化程序的执行效率,当然了在单线程中这个是不会影响到的,关键是多线程的时候就出现问题了。、

那么在Java中怎么可以确保有序性呢?不让编译器和处理器对指令进行重排序呢?

volatile,同步,还有锁这个时候就需要出现在我们的脑海了。还有就是Java本身是有一些动作是可以确保有序性的,那就是我们常说的happen-before原则。

最后,最重要的是:要确保并发程序的安全性,上面的三个条件缺一不可。而只保证一个或者两个,我们无法确保此时结果的正确性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值