您当前的位置:首页 > 电脑百科 > 程序开发 > 语言 > JAVA

五分钟看穿Java并发相关概念,并发原来如此简单

时间:2020-04-29 16:41:35  来源:  作者:

本文主要对JAVA并发(Concurrent)相关的概念进行说明。

1.进程(Process)与线程(Thread)

  1. 进程是系统资源分配的最小单元。线程是CPU调度的最小单元。
  2. 一个 进程至少包含一个线程,可以包含多个线程。这些线程共享这个进程的资源。
  3. 每个线程都拥有独立的运行栈和程序计数器,线程切换开销小。
  4. 多进程指的是操作系统同时运行多个程序,如当前操作系统中同时运行着QQ、IE、微信等程序。
  5. 多线程指的是同一进程中同时运行多个线程,如迅雷运行时,可以开启多个线程,同时进行多个文件的下载。

2.并行(Parallel)、并发(Concurrent)与多线程(Multithreading)

  1. 并行是指多个任务在同一时刻进行。并发是指多个任务在同一时间段内发生。
  2. 并行是物理上的同时发生,而并发是逻辑上的同时发生。
  3. 体现在程序上: 并行是指多个CPU内核在同一时刻,同时运行多个任务。并发是指单个CPU内,通过CPU调度算法,让用户感觉在同时运行多个任务。
  4. 更形象的说法: 并行是指两队人员同时使用两台咖啡机。并发是指两队人员交替使用同一台咖啡机。—-Erlang 之父 Joe Armstrong。
五分钟看穿Java并发相关概念,并发原来如此简单

 

  1. 多线程即多个线程,一般只多个同时在运行的单线程。
  2. 如果是在单核CPU上,多线程肯定是并发运行的。如果是在多核CPU上,这些多线程也可能是并行运行。

3.线程安全

线程安全,指的是在并发的情况之下,线程的调度顺序不影响运行结果。

如不加锁控制的转账操作,在单线程运行中是安全的,但是在多线程环境中,肯定是不安全的。这里只给出示例,具体逻辑就没不解释了。

void transferMoney(User from, User to, float amount){
    to.setMoney(to.getBalance() + amount);
    from.setMoney(from.getBalance() - amount);
}

4.死锁

死锁是指两个或更多线程阻塞着等待其它处于死锁状态的线程所持有的锁。

例如,

  • 如果线程1锁住了A,然后尝试对B进行加锁,同时线程2已经锁住了B,接着尝试对A进行加锁,这时死锁就发生了。
  • 线程1永远得不到B,线程2也永远得不到A,并且它们永远也不会知道发生了这样的事情。
  • 为了得到彼此的对象(A和B),它们将永远阻塞下去。这种情况就是一个死锁。

5.并发优点

5.1.资源利用率高

假定场景:需要从本地读取和处理两个文件,读取一个文件需要5秒,处理一个文件需要2秒。单线程:

5秒读取文件A
2秒处理文件A
5秒读取文件B
2秒处理文件B
---------------------
总共需要14秒

多线程:

5秒读取文件A
5秒读取文件B + 2秒处理文件A
2秒处理文件B
---------------------
总共需要12秒

总结:

  • 在等待磁盘读取文件的时候,CPU大部分时间是空闲的。
  • 利用多线程编程,可以在磁盘读取文件的CPU空闲时间内做一些其他的事情。
  • 所以说, 使用多线程资源利用率更高。

5.2.程序响应更快

一个桌面应用程序存在多个按钮。点击这些按钮,可以分别进行一些耗时的工作。

单线程:

每次点击一个按钮,都会进行一项耗时的工作。必须等待此项工作完成之后,才能继续监听用户操作。这时,用户才能点击其他按钮,进行其他的工作。这样的应用程序,对用户而言,响应十分慢,体验度很差。

多线程:

每次点击一个按钮,都会启动一个子线程去进行这项耗时的工作,主线程继续监听用户操作。这种情况下,用户可以快速的分别点击需要处理的按钮。这样的应用程序,对用户而言,响应很快,体验度很好。

6.并发缺点

6.1.设计开发更复杂

线程之间的交互往往非常复杂。 不正确的线程同步产生的错误非常难以发现,并且难以重现、难以修复。

6.2.增加额外资源消耗

多线程开发会产生额外的资源消耗,主要来源于三个方面:

  • 线程本身需要消耗一些资源进行本地堆栈的维持与管理。
  • 线程之间切换会导致的上下文切换(Context Switch)开销。
  • 多线程的管理对CPU来说又是一笔开销。

所以,由于多线程会增加额外的资源消耗,对多线程程序而言,线程并不是越多就会越快,过多的线程返回会导致程序变慢。



Tags:Java并发   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
Java从版本5开始,在 java.util.concurrent.locks包内给我们提供了除了synchronized关键字以外的几个新的锁功能的实现,ReentrantLock就是其中的一个。但是这并不意味着我们可...【详细内容】
2021-12-17  Tags: Java并发  点击:(11)  评论:(0)  加入收藏
本篇文章我们以AtomicInteger为例子,主要讲解下CAS(Compare And Swap)功能是如何在AtomicInteger中使用的,以及提供CAS功能的Unsafe对象。我们先从一个例子开始吧。假设现在我们...【详细内容】
2021-12-14  Tags: Java并发  点击:(21)  评论:(0)  加入收藏
Java为我们提供了一些效果非常不错的并发工具类,这里主要介绍一下如下几个工具类的使用,并不会去深究实现原理(其实原理都是通过自旋CAS,CAS对应的处理器原子操作指令是CMPXCHG...【详细内容】
2021-04-27  Tags: Java并发  点击:(260)  评论:(0)  加入收藏
AtomicInteger 类提供了int类型的变量,变量可以原子写和读,同时还包括先进的原子操作例如 compareAndSet()。 AtomicInteger 类位于java.util.concurrent.atomic 包中,全名java...【详细内容】
2020-08-12  Tags: Java并发  点击:(121)  评论:(0)  加入收藏
java.util.concurrent.ScheduledExecutorService是一个可以安排任务延迟执行的 ExecutorService , 或者以固定的时间间隔重复执行。任务通过一个工作线程异步执行,而不是提交...【详细内容】
2020-08-04  Tags: Java并发  点击:(47)  评论:(0)  加入收藏
Disruptor是什么?Disruptor是一个高性能的异步处理框架,一个轻量级的JMS,和JDK中的BlockingQueue有相似处,但是它的处理速度非常快,获得2011年程序框架创新大奖,号称“一个线程一...【详细内容】
2020-07-15  Tags: Java并发  点击:(82)  评论:(0)  加入收藏
Java并发工具类主要有CyclicBarrier、CountDownLatch、Semaphore和Exchanger,日常开发中经常使用的是CountDownLatch和Semaphore。下面就简单分析下这几个并发工具类:CyclicB...【详细内容】
2020-06-18  Tags: Java并发  点击:(59)  评论:(0)  加入收藏
不考虑多线程并发的情况下,容器类一般使用ArrayList、HashMap等线程不安全的类,效率更高。在并发场景下,常会用到ConcurrentHashMap、ArrayBlockingQueue等线程安全的容器类,虽然牺牲了一些效率,但却得到了安全。...【详细内容】
2020-05-14  Tags: Java并发  点击:(44)  评论:(0)  加入收藏
本文主要对Java并发(Concurrent)相关的概念进行说明。1.进程(Process)与线程(Thread) 进程是系统资源分配的最小单元。线程是CPU调度的最小单元。 一个 进程至少包含一个线...【详细内容】
2020-04-29  Tags: Java并发  点击:(26)  评论:(0)  加入收藏
Java并发编程之验证volatile指令重排-理论篇Java并发包下的类中大量使用了volatile关键字。通过之前文章介绍,大家已经知道了volatile的三大特性:共享变量可见性;不保证原子性;...【详细内容】
2020-03-23  Tags: Java并发  点击:(63)  评论:(0)  加入收藏
▌简易百科推荐
面向对象的特征之一封装 面向对象的特征之二继承 方法重写(override/overWrite) 方法的重载(overload)和重写(override)的区别: 面向对象特征之三:多态 Instanceof关键字...【详细内容】
2021-12-28  顶顶架构师    Tags:面向对象   点击:(2)  评论:(0)  加入收藏
一、Redis使用过程中一些小的注意点1、不要把Redis当成数据库来使用二、Arrays.asList常见失误需求:把数组转成list集合去处理。方法:Arrays.asList 或者 Java8的stream流式处...【详细内容】
2021-12-27  CF07    Tags:Java   点击:(3)  评论:(0)  加入收藏
文章目录 如何理解面向对象编程? JDK 和 JRE 有什么区别? 如何理解Java中封装,继承、多态特性? 如何理解Java中的字节码对象? 你是如何理解Java中的泛型的? 说说泛型应用...【详细内容】
2021-12-24  Java架构师之路    Tags:JAVA   点击:(5)  评论:(0)  加入收藏
大家好!我是老码农,一个喜欢技术、爱分享的同学,从今天开始和大家持续分享JVM调优方面的经验。JVM调优是个大话题,涉及的知识点很庞大 Java内存模型 垃圾回收机制 各种工具使用 ...【详细内容】
2021-12-23  小码匠和老码农    Tags:JVM调优   点击:(11)  评论:(0)  加入收藏
前言JDBC访问Postgresql的jsonb类型字段当然可以使用Postgresql jdbc驱动中提供的PGobject,但是这样在需要兼容多种数据库的系统开发中显得不那么通用,需要特殊处理。本文介绍...【详细内容】
2021-12-23  dingle    Tags:JDBC   点击:(13)  评论:(0)  加入收藏
Java与Lua相互调用案例比较少,因此项目使用需要做详细的性能测试,本内容只做粗略测试。目前已完成初版Lua-Java调用框架开发,后期有时间准备把框架进行抽象,并开源出来,感兴趣的...【详细内容】
2021-12-23  JAVA小白    Tags:Java   点击:(11)  评论:(0)  加入收藏
Java从版本5开始,在 java.util.concurrent.locks包内给我们提供了除了synchronized关键字以外的几个新的锁功能的实现,ReentrantLock就是其中的一个。但是这并不意味着我们可...【详细内容】
2021-12-17  小西学JAVA    Tags:JAVA并发   点击:(11)  评论:(0)  加入收藏
一、概述final是Java关键字中最常见之一,表示“最终的,不可更改”之意,在Java中也正是这个意思。有final修饰的内容,就会变得与众不同,它们会变成终极存在,其内容成为固定的存在。...【详细内容】
2021-12-15  唯一浩哥    Tags:Java基础   点击:(17)  评论:(0)  加入收藏
1、问题描述关于java中的日志管理logback,去年写过关于logback介绍的文章,这次项目中又优化了下,记录下,希望能帮到需要的朋友。2、解决方案这次其实是碰到了一个问题,一般的情况...【详细内容】
2021-12-15  软件老王    Tags:logback   点击:(19)  评论:(0)  加入收藏
本篇文章我们以AtomicInteger为例子,主要讲解下CAS(Compare And Swap)功能是如何在AtomicInteger中使用的,以及提供CAS功能的Unsafe对象。我们先从一个例子开始吧。假设现在我们...【详细内容】
2021-12-14  小西学JAVA    Tags:JAVA   点击:(21)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条