Java并发编程以及并发须知的几个概念:什么是线程安全?

众所周知,在Java的知识体系中,并发编程是非常重要的一环,也是面试的必问题,一个好的Java程序员是必须对并发编程这块有所了解的。为了追求成为一个好的Java程序员,我决定从今天开始死磕Java的并发编程,尽量弥补自己在这方面的知识缺陷。

并发必须知道的概念

在深入学习并发编程之前,我们需要了解几个基本的概念。

同步和异步

同步和异步用请求返回调用的方式来理解相对简单。

同步:可以理解为发出一个请求后,必须等待返回结果才能执行下面的操作。

异步:请求发出后,不需要等待返回结果,可以继续执行后续操作,异步请求更像是在另一个 “空间” 中处理请求的结果,这个过程不会影响请求方的其他操作。

举个生活中的例子,比如我们去实体店买衣服,挑选完款式后下单让售货员去仓库拿货,在售货员拿货的过程你需要在店里等待,直到售货员把衣服交给你后才算购物成功,这就相当于同步的过程。

不过,如果是在网上购物的话,我们只需下单并完成支付,对我们来说整个购物过程就算完成了。网上的商家接到订单会帮我们加紧安排送货,这段时间我们可以去做其他的事,比如去外面打个篮球之类的。等送货上门并签收商品就完事了,这个过程就相当于异步。

并发和并行

并发和并行的功能很相似,两者都可以表示多个任务一起执行的情况,但本质上两者其实是有区别的。

严格意义上来说,并行的多任务是真实的同时执行,而并发更多的情况是任务之间交替执行,系统不停的在多个任务间切换执行,也就是 “串行” 执行。

最直接的例子的就是我们的计算机系统,在单核CPU时代,系统表面上能同时进行多任务处理,比如听歌的同时又浏览网页,但真实环境中这些任务不可能是真实并行的,因为一个CPU一次只能执行一条指令,这种情况就是并发,系统看似能处理多任务是因为不停的切换任务,但因为时间非常短,所以在我们的感官来说就是同时进行的。而计算机系统真实的并行是随着多核CPU的出现才有的。

临界区

临界区表示公共资源或是共享数据,可以被多个线程使用。但是每次只能有一个线程使用它,一旦临界区的资源被占用,其他线程就必须等到资源释放后才能继续使用该资源。在Java程序开发中,对于这样的资源一般都需要做同步的操作,例如下面的这段代码,用的就是synchronized关键字来对临界区资源进行同步

public class SyncTest implements Runnable {

//临界区资源

public static SyncTest instance = new SyncTest();

@Override

public void run() {

synchronized (instance) {

}

}

public static void main(String[] args) throws InterruptedException {

Thread t1 = new Thread(new SyncTest());

Thread t2 = new Thread(new SyncTest());

t1.start();

t2.start();

t1.join();

t2.join();

}

}

阻塞和非阻塞

阻塞和非阻塞通常用来形容多线程间的相互影响。比如一个线程占用了临界区的资源,那么其他需要这个资源的线程就必须等待。等待的过程会使线程挂起,也就是阻塞。如果临界区的资源一直不释放的话,那么其他阻塞的线程就都不能工作了。

非阻塞则相反,强调的是线程之间并不互相妨碍,所有的线程都会不断尝试向前执行。

死锁、饥饿和活锁

这三种情况表示的是多线程间的活跃状态,对于线程来说,以上的情况都是 “非友好” 的状态。

1、死锁一般是指两个或者两个以上的线程互相持有对方所需的资源,并且永远在等待对方释放的一种阻塞状态。例如有两个线程A和B同时共享临界区的资源C,当A占用C时,B处于阻塞状态,然而A的释放需要用到B的资源,这样一来,就变成了A一直在等待B,B也一直在等待A,互相之间永远在等待对方释放的状态。

一般来说,死锁的发生是由于程序的设计不合理导致,而且死锁很难解决,最好的方式就是预防。

2、饥饿是指某一个或者多个线程因为种种原因无法获得所需的资源,导致一直无法执行。比如它的线程优先级太低,而高优先级的线程不断抢占它所需的资源,导致低优先级资源无法工作。

3、活锁的情况是线程一种非常有趣的情况,在生活中我们可能会碰到这样的情况,那就是出门的时候可能会遇到有人要进门,你打算让他先进门,他又打算让你先出门,结果,两个人都互相退后了,然后你打算先出门时对方也向前一步,来来回回就一直卡在门口。当然,这种事情正常人很快就能解决,但如果是线程碰到就没那么幸运了。

如果两个线程占用着公共的资源,并且秉承着 “谦让” 的原则,主动把资源让给他人使用,你让我也让,这样就造成资源在两个线程间不断跳动但线程之间都拿不到资源的情况,这样的情况就是活锁了。

线程安全

线程安全指的是多线程的安全。如果一段程序可以保证被多线程访问后仍能保持正确性,那么程序就是线程安全的。一般来说,线程安全注重的是多线程开发中的共享数据的安全。就比如下面这段代码:

public class ThreadSafety implements Runnable{

//共享数据

public static int i = 0;

public void increase(){

for (int j= 0;j<10; j++){

i++;

}

}

@Override

public void run() {

increase();

}

public static void main(String[] args) throws Exception{

ThreadSafety demo = new ThreadSafety();

Thread t1 = new Thread();

Thread t2 = new Thread();

t1.start();

t2.start();

t1.join();

t2.join();

System.out.println(i);

}

}

两个线程 t1 和 t2 同时开启,执行run方法,在我们的预想中,如果是线程安全的话,那么main的执行结果应该是20,但是因为 i 是共享数据,而程序没有对 i 的操作做同步的处理,最终运行的结果并不是20,所以这种情况就不是线程安全的情况。

解决的办法也比较简单,可以利用synchronized关键字来修饰方法或代码块,这部分的知识也是并发编程中非常重要的一块,之后单独写篇文章出来细说。

为了让学习变得轻松、高效,今天给大家免费分享一套Java入门教学资源。帮助大家在成为Java架构师的道路上披荆斩棘。需要入门的资料欢迎加入学习交流群:9285,05736

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/503317.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java的主要特性有哪些?

Java语言是简单的&#xff1a; Java语言的语法与C语言和C语言很接近&#xff0c;使得大多数程序员很容易学习和使用。另一方面&#xff0c;Java丢弃了C中很少使用的、很难理解的、令人迷惑的那些特性&#xff0c;如操作符重载、多继承、自动的强制类型转换。特别地&#xff0c…

车载异构网络接入matlab,车载移动异构无线网络架构及关键技术

计算机技术、通信技术和微电子技术的迅速发展&#xff0c;以及三者之间的相互渗透和融合奠定了通信网络技术的应用&#xff0c;推动了社会信息化的发展。近年来&#xff0c;车辆的爆发式增长和无处不在的信息需求也日益将通信网络和车辆紧密结合起来。人们在车辆移动过程中的通…

Java的面试汇总,有这些还担心不通过?

面试官提问的内容通常会由易到难&#xff0c;如果前面容易的内容都答不上来&#xff0c;往往就被刷了&#xff0c;如果是前面提问的都答上来了&#xff0c;他会问一些有深度的问题&#xff0c;这时候就算你回答不上来也不要慌张&#xff0c;他只是看看你的薪资水平而已 接下来…

c matlab.h,用matlab和c写程序,include的mex.h在哪里?

span namewhlm idwhlm请看这个帖子【mcc、mbuild和mex命令详解】a href"http://www.matlabsky.com/thread-544-1-1.html"http://www.matlabsky.com/thread-544-1-1.html/a(1)创建MEX文件>>mcc –x filename (注意这个命令在2008a中已经去掉了)将M文件filename.…

Java开发需要达到什么样的水平才称得上架构师?

小编就从Java架构师&#xff08;P7&#xff09;岗位说起吧&#xff0c;年薪40w&#xff0c;那我们看看什么公司&#xff0c;什么级别可以给到&#xff0c;再看看要求。阿里是Java大厂&#xff0c;所以可以参考阿里的标准&#xff0c;阿里一般是16薪水&#xff0c;所以就是税前2…

java八股 mysql优化

数据库篇-01-MySQL篇-课程介绍_哔哩哔哩_bilibili 1.定位慢查询 2.分析优化慢查询 3.索引概念及结构 3.1 红黑树&#xff08;一种自平衡的二叉排序树&#xff09; 节点可以自动平衡保证log2 n的查找复杂度. 但因为是二叉树&#xff0c;数据多了层数还会多。 所以找一个多叉树 3…

Java开发中快速提升编码能力的方法有哪些?

Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言。Java 技术具有卓越的通用性、高效性、平台移植性和安全性&#xff0c;广泛应用于PC、数据中心、游戏控制台、科学超级计算机、移动电话和互联网&#xff0c;同时拥有全球最大的开发者专业社群。 Java是一种简单的&…

Java虚拟机知识汇总,有这些还怕面试被问到?

首先我们来看一下Java运行时的数据区域&#xff0c;Java虚拟机在执行Java程序的过程中&#xff0c;会把它所管理的内存&#xff0c;划分成若干个不同的数据区域&#xff0c;这些区域都有各自的用途&#xff0c;各自的创建和销毁的时间。 有的区域&#xff0c;随着虚拟机进程的…

Java的多线程以及内存模型的知识点梳理,有想到过这些吗?

JMM大致描述&#xff1a; JMM描述了线程如何与内存进行交互。Java虚拟机规范视图定义一种Java内存模型&#xff0c;来屏蔽掉各种操作系统内存访问的差异&#xff0c;以实现Java程序在各种平台下都能达到一致的访问效果。 JMM描述了JVM如何与计算机的内存进行交互 JMM都是围绕…

Java性能优化方面的程序优化知识点归纳,希望对你有所帮助

常用的程序设计优化技巧&#xff1a; 1、字符串优化处理 &#xff08;1&#xff09;String 类的特点&#xff1a;不变性、针对常量池的优化&#xff08; String.intern() 方法的意义&#xff09; &#xff08;2&#xff09;subString 方法的内存泄漏 : &#xff08;3&#…

java工具栏的工具提示,动态菜单项、状态条提示、工具条提示问题

问题的提出&#xff1a;一个应用程序想要动态改变菜单项。使用CCmdUI::SetText("Menu Text")可以改变菜单文本&#xff0c;但是如何动态改变工具条和状态条的文本呢&#xff1f;有几种策略&#xff0c;避免&#xff0c;欺骗&#xff0c;面对......首先&#xff0c;避…

python excel操作库,可能是全网最完整的 Python 操作 Excel库总结!

openpyxlxlrd/xlwtxlwingsxlsxwriter了解各个库的异同&#xff0c;从而在不同场景下可以灵活使用首先让我们来整体把握下不同库的特点“xlrdxlwtxlutils.xlsxlwt.xlsxlrd.xlsxlutilsxlrdxlwt.xlsxlrdxlwtxlutilsxlwingsXlsxWriter.xlsxopenpyxl.xlsxpandas”如果你懒得看详细的…

Java编程中程序员会遇到的一些感性烦恼,你有遇到吗?

如果作为兴趣来学编程&#xff0c;什么人都适合。毕竟&#xff0c;现在小学生都开始学习编程了。如果要作为职业来说&#xff0c;你到底适合不适合确实是个问题。我教过的学员里面从初中生到博士生、甚至50多岁的企业高管都有&#xff0c;怀着不同的目的来学习JAVA。 我记得教过…

java开发中spring常用的工具类

内置的resouce类型 UrlResourceClassPathResourceFileSystemResourceServletContextResourceInputStreamResourceByteArrayResourceEncodedResource 也就是Resource加上encoding, 可以认为是有编码的资源VfsResource(在jboss里经常用到, 相应还有 工具类 VfsUtils)org.springf…

python波士顿房价是什么数据,Python数据分析 | 波士顿房价回归分析

分析目标&#xff1a;将波士顿房价的数据集进行描述性数据分析、预测性数据分析(主要用了回归分析)&#xff0c;可用于预测房价。数据集介绍&#xff1a;卡内基梅隆大学收集&#xff0c;StatLib库&#xff0c;1978年&#xff0c;涵盖了麻省波士顿的506个不同郊区的房屋数据。一…

Java开发的Spring Boot的核心模块

Spring Boot 的核心模块 下面我们大概来了解一下 Spring Boot 的核心模块。 1、spring-boot 这是 Spring Boot 的主模块&#xff0c;也是支持其他模块的核心模块&#xff0c;主要包含以下几点&#xff1a; 提供了一个启动 Spring 应用的主类&#xff0c;并提供了一个相当方便…

java开发中对于程序员的几点建议,你们有想到吗?

建议一&#xff1a;只有真正喜欢才能写好程序 喜欢写程序&#xff0c;做程序员就是上天堂&#xff1b; 不喜欢写程序&#xff0c;做程序员就是下地狱&#xff1b; 程序员需要整天趴在电脑前&#xff0c;经常没日没夜的&#xff0c;非常辛苦&#xff0c;而且工作来不得半点虚…

Java面向对象和面向过程有什么区别?网友:傻傻分不清楚……

面向对象&#xff0c;Obeject Oriented&#xff0c;是一种编程术语。面向对象是当今软件开发方法的主流方法之一&#xff0c;他是把数据以及对数据的操作放在一起&#xff0c;作为一个相互依存的整体&#xff0c;就是我们所说的对象。对同类对象抽象出其共性&#xff0c;就是类…

Java 反射机制和动态代理是基于什么原理,了解过吗?

工作多年以及在面试中&#xff0c;我经常能体会到&#xff0c;有些面试者确实是认真努力工作&#xff0c;但坦白说表现出的能力水平却不足以通过面试&#xff0c;通常是两方面原因&#xff1a; 1、“知其然不知其所以然”。 做了多年技术&#xff0c;开发了很多业务应用&#x…

成长为一名Java架构师需要掌握的技术有哪些呢?

Java架构师需要掌握的技术&#xff1a; 1、熟练使用各种框架&#xff0c;并知道它们实现的原理。 2、jvm虚拟机原理、调优&#xff0c;懂得jvm能让你写出性能更好的代码&#xff1b; 3、池技术&#xff0c;什么对象池&#xff0c;连接池&#xff0c;线程池……Java反射技术&…