本篇内容介绍了“Java并发怎么理解”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
什么是并发?用户通常认为计算机在同一时刻可以做多个事情是理所当然的事情。
例1:例如你可以一边听音乐,一边玩游戏,同时还通过聊天工具和别人聊天。假设你使用的qq音乐播放器在听音乐,玩的是qq斗地主游戏,使用qq和别聊天,那么这实际上是三个不同的软件在同时运行,完成三个不同的事情。
例2:当然我们也不能否认,在一个软件内,同时可以完成以上三个事情:聊天、游戏和音乐。例如你在玩qq斗地主,以便在打pai,播放了背景音乐,同时你还可以和其他牌友聊天,发一句"我等的花儿也谢了",这实际上是一个软件可以同时完成三个不同的事情。
不管是那种情况,我们应该知道的是,并发指的是在同一时刻执行多个任务。
java并发基础
线程本身有很多优势,比如可以发挥多处理器的强大能力、建模更加简单、简化异步事件的处理、是用户界面的相应更加灵敏,但是更多的我们面对的是安全性问题,例如:
public class Concurrence{
private int value;
/*返回一个唯一的数值*/
public int getValue(){
return value++;
}
}
Concurrence的问题在于,如果执行时机不对,那么两个线程在调用getValue时会得到相同的值,错误示范:
虽然递增运算value ++ 看上去是单操作,但是它包含了三个独立的操作: 读取Value、value + 1 、计算结果写入Value。由于运行,可能将多个线程之间的操作交替执行,因此这两个线程可能同事执行读取操作,从而使它们得到相同的值,并都将这个值加1。结果就是,在不同线程的调用中返回了相同的值。
在Concurrence中说明的是一种常见的并发安全问题,称为竞态条件。当某个计算的正确性取决于多个线程的交替执行时序时,那么就会发生竞态条件。
Java并发性和多线程介绍
在过去单CPU时代,单任务在一个时间点只能执行单一程序。之后发展到多任务阶段,计算机能在同一时间点并行执行多任务或多进程。虽然并不是真正意义上的“同一时间点”,而是多个任务或进程共享一个CPU,并交由操作系统来完成多任务间对CPU的运行切换,以使得每个任务都有机会获得一定的时间片运行。
随着多任务对软件开发者带来的新挑战,程序不在能假设独占所有的CPU时间、所有的内存和其他计算机资源。一个好的程序榜样是在其不再使用这些资源时对其进行释放,以使得其他程序能有机会使用这些资源。
再后来发展到多线程技术,使得在一个程序内部能拥有多个线程并行执行。一个线程的执行可以被认为是一个CPU在执行该程序。当一个程序运行在多线程下,就好像有多个CPU在同时执行该程序。
多线程比多任务更加有挑战。多线程是在同一个程序内部并行执行,因此会对相同的内存空间进行并发读写操作。这可能是在单线程程序中从来不会遇到的问题。其中的一些错误也未必会在单CPU机器上出现,因为两个线程从来不会得到真正的并行执行。然而,更现代的计算机伴随着多核CPU的出现,也就意味着不同的线程能被不同的CPU核得到真正意义的并行执行。
如果一个线程在读一个内存时,另一个线程正向该内存进行写操作,那进行读操作的那个线程将获得什么结果呢?是写操作之前旧的值?还是写操作成功之后的新值?或是一半新一半旧的值?或者,如果是两个线程同时写同一个内存,在操作完成后将会是什么结果呢?是第一个线程写入的值?还是第二个线程写入的值?还是两个线程写入的一个混合值?因此如没有合适的预防措施,任何结果都是可能的。而且这种行为的发生甚至不能预测,所以结果也是不确定性的。
“Java并发怎么理解”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注亿速云网站,小编将为大家输出更多高质量的实用文章!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。