在开始我们的并发编程前,我们必须预热一下,一些基本概念必须了解。

1. 同步(Synchronous) / 异步(Asynchronous)

同步和异步都指一次方法调用。

同步:方法开始后,调用者必须等到该方法调用结束返回后,才能继续后续的操作。

异步:异步方法有点像发送一个消息传递,开始后方法调用会立即返回,调用者可以马上

进行后续的操作。

(异步方法通常会在主线程外的另一个线程中, 不会阻碍主线程)

2. 并发(Concurrency) / 并行(Parallelism)

我们经常会混淆并发(Concurrency)和并行(Parallelism)。

相同点:它们都表示多个任务一起执行。

不同点:并发(Concurrency)偏重于多个任务交替执行,这些任务彼此之间可能是串行的。

(eg: 一会儿运行任务A, 一会儿又运行任务B, 系统不会不停地在多个任务间进行切换)

并行(Parallelism)才是真正意义上的同时执行。

场景:

如果系统只有一个CPU(单核), 如果我们使用多线程,那么是不可能并行的,因为一个CPU一次只能执行一条指令。

真实的并行只能出现在多个CPU(多核)的系统中。

3. 临界区

它指的是一种公共资源,该资源每次只能有一个线程使用它,一旦它被某个线程所占用,其它线程就必须等待。

4. 阻塞(Block) / 非阻塞(Non-Block)

阻塞和非阻塞用来形容多个线程间的相互影响。

场景:

一个线程占用了临界区资源,其它线程挂起等待,这种情况就是阻塞。

非阻塞是指所有的线程都不断向前执行,没有被挂起。

5. 死锁(DeadLock) / 饥饿(Starvation) / 活锁(LiveLock)

它们都属于线程的活跃性问题。

死锁是一种很严重的问题。

比如几辆车互相挡住了各自的通道,大家都不愿意让出自己的通道,导致死循环。

饥饿是指某个线程因为某些原因无法获得所需要的资源,导致一直无法执行。

这种情况可能是该线程的优先级太低,高优先级的线程不断抢占它需要的资源。

或者是某个线程一直占着关键资源不放,导致其它需要这个资源的线程无法执行。

活锁比较有趣,它指的是线程都主动将资源释放给他人使用,大家把这个资源丢来丢去,没人肯接受。

这样就导致没有一个线程可以同时拿到所有的资源而正常执行。

太谦让也不好!!^_^

6. 原子性(Atomicity)

原子性是指一个操作是不可中断的,该操作一旦执行,就不能被中断,即使在多线程的环境中,也不会被其他线程干扰。

Java并发编程 - 基本概念的更多相关文章

  1. java并发编程基础概念

    本次内容主要讲进程和线程.CPU核心数和线程数.CPU时间片轮转机制.上下文切换,并行和并发的基本概念以及并发编程的好处和注意事项,为java并发编程打下扎实基础. 1.什么是进程和线程 1.1 进程 ...

  2. Java并发编程核心概念一览

    作者博客地址 https://muggle.javaboy.org. 并行相关概念 同步和异步 同步和异步通常来形容一次方法的调用.同步方法一旦开始,调用者必须等到方法结束才能执行后续动作:异步方法则 ...

  3. 【java并发编程实战】-----线程基本概念

    学习Java并发已经有一个多月了,感觉有些东西学习一会儿了就会忘记,做了一些笔记但是不系统,对于Java并发这么大的"系统",需要自己好好总结.整理才能征服它.希望同仁们一起来学习 ...

  4. Java并发编程(一)-- 多线程的基本概念

    多线程发展进程 在过去单CPU时代,单任务在一个时间点只能执行单一程序:发展到多任务阶段,计算机能在同一时间点并行执行多任务或多进程--虽然并不是真正意义上的“同一时间点”,而是多个任务或进程共享一个 ...

  5. 原创】Java并发编程系列2:线程概念与基础操作

    [原创]Java并发编程系列2:线程概念与基础操作 伟大的理想只有经过忘我的斗争和牺牲才能胜利实现. 本篇为[Dali王的技术博客]Java并发编程系列第二篇,讲讲有关线程的那些事儿.主要内容是如下这 ...

  6. 【Java并发编程实战】-----“J.U.C”:ReentrantReadWriteLock

    ReentrantLock实现了标准的互斥操作,也就是说在某一时刻只有有一个线程持有锁.ReentrantLock采用这种独占的保守锁直接,在一定程度上减低了吞吐量.在这种情况下任何的"读/ ...

  7. Java并发编程:volatile关键字解析

    Java并发编程:volatile关键字解析 volatile这个关键字可能很多朋友都听说过,或许也都用过.在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果.在 ...

  8. 【Java并发编程实战】-----“J.U.C”:Semaphore

    信号量Semaphore是一个控制访问多个共享资源的计数器,它本质上是一个"共享锁". Java并发提供了两种加锁模式:共享锁和独占锁.前面LZ介绍的ReentrantLock就是 ...

  9. java并发编程系列

    1.多线程的概念与使用:java笔记五:多线程的使用 2.多线程产生的问题,解决的方法, 1.引入线程池的原因:Java并发编程:线程池的使用 2.高并发情况下数据库提交:jdbc事务处理, 理解事务 ...

随机推荐

  1. WIN8系统中 任务管理器 性能栏 显示CPU利用率(已暂停)怎么回事?

    解决办法: 点上方的 查看--更新速度--普通

  2. 基于TQ2440和Qemu的GDB+串口调试(1)

    作者 彭东林 pengdonglin137@163.com   平台 TQ2440 + Linux-4.10.17 Qemu(vexpress-ca9) + Linux-4.10.17   概述 下面 ...

  3. ASP.NET MVC下实现前端视图页的Session

    在ASP.NET MVC的控制器中可以实现Session处理.如果要在前端视图页实现Session该如何做呢?可以使用window.sessionStorage来做. AlexChittock用jQu ...

  4. 再议ASP.NET MVC中CheckBoxList的验证

    在ASP.NET MVC 4中谈到CheckBoxList,经常是与CheckBoxList的显示以及验证有关.我在"MVC扩展生成CheckBoxList并水平排列"中通过扩展H ...

  5. div与span区别及用法

    DIV与SPAN区别及div与san用法篇 接下来了解在div+css开发的时候在html网页制作,特别是标签运用中div和span的区别及用法.新手在使用web标准(div css)开发网页的时候, ...

  6. 多线程UI

    遇到过要在工作线程中去更新UI以让用户知道进度,而在多线程中直接调用UI控件操作是错误的做法. 最后解决方法是将操作UI的代码封装,通过Invoke / BeginInvoke 去委托调用. priv ...

  7. Caused by: java.lang.IllegalArgumentException: Can not set int field reyo.sdk.enity.xxx.xxx to java.lang.Long

    由于数据库字段设置不正确引起的,不能选中 alter <table> modify <column> int unsigned; 关于unsigned int类型,可以看看它的 ...

  8. spring post 图片

    @RequestMapping(value = "/post",method = RequestMethod.POST) @ResponseBody String GPost(@R ...

  9. fasttext介绍和试用

    http://fasttext.apachecn.org/cn/docs/v0.1.0/support.html fasttext介绍网站 https://github.com/facebookres ...

  10. git pull fails “unable to resolve reference” “unable to update local ref”

    问题 由于有人rebase了分支,或者不知道怎么搞的.其他人拉取代码的时候,发现拉不下来. >git fetch error: cannot lock ref 'refs/remotes/ori ...