Java并发编程 - 基本概念
在开始我们的并发编程前,我们必须预热一下,一些基本概念必须了解。
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并发编程 - 基本概念的更多相关文章
- java并发编程基础概念
本次内容主要讲进程和线程.CPU核心数和线程数.CPU时间片轮转机制.上下文切换,并行和并发的基本概念以及并发编程的好处和注意事项,为java并发编程打下扎实基础. 1.什么是进程和线程 1.1 进程 ...
- Java并发编程核心概念一览
作者博客地址 https://muggle.javaboy.org. 并行相关概念 同步和异步 同步和异步通常来形容一次方法的调用.同步方法一旦开始,调用者必须等到方法结束才能执行后续动作:异步方法则 ...
- 【java并发编程实战】-----线程基本概念
学习Java并发已经有一个多月了,感觉有些东西学习一会儿了就会忘记,做了一些笔记但是不系统,对于Java并发这么大的"系统",需要自己好好总结.整理才能征服它.希望同仁们一起来学习 ...
- Java并发编程(一)-- 多线程的基本概念
多线程发展进程 在过去单CPU时代,单任务在一个时间点只能执行单一程序:发展到多任务阶段,计算机能在同一时间点并行执行多任务或多进程--虽然并不是真正意义上的“同一时间点”,而是多个任务或进程共享一个 ...
- 原创】Java并发编程系列2:线程概念与基础操作
[原创]Java并发编程系列2:线程概念与基础操作 伟大的理想只有经过忘我的斗争和牺牲才能胜利实现. 本篇为[Dali王的技术博客]Java并发编程系列第二篇,讲讲有关线程的那些事儿.主要内容是如下这 ...
- 【Java并发编程实战】-----“J.U.C”:ReentrantReadWriteLock
ReentrantLock实现了标准的互斥操作,也就是说在某一时刻只有有一个线程持有锁.ReentrantLock采用这种独占的保守锁直接,在一定程度上减低了吞吐量.在这种情况下任何的"读/ ...
- Java并发编程:volatile关键字解析
Java并发编程:volatile关键字解析 volatile这个关键字可能很多朋友都听说过,或许也都用过.在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果.在 ...
- 【Java并发编程实战】-----“J.U.C”:Semaphore
信号量Semaphore是一个控制访问多个共享资源的计数器,它本质上是一个"共享锁". Java并发提供了两种加锁模式:共享锁和独占锁.前面LZ介绍的ReentrantLock就是 ...
- java并发编程系列
1.多线程的概念与使用:java笔记五:多线程的使用 2.多线程产生的问题,解决的方法, 1.引入线程池的原因:Java并发编程:线程池的使用 2.高并发情况下数据库提交:jdbc事务处理, 理解事务 ...
随机推荐
- View Programming Guide for iOS_读书笔记
关于Window的定义的要点 Windows do not have any visible content themselves but provide a basic container for ...
- 浅析c++中virtual关键字
http://blog.csdn.net/djh512/article/details/8973606 1.virtual关键字主要是什么作用? c++中的函数调用默认不适用动态绑定.要触发动态绑定, ...
- WordPress主题开发实例:查询单篇文章
xxx/?page_id=5 想在首页调用以上页面的内容怎么做呢? 完整: <?php //查询 $my_query = new WP_Query( 'page_id=5' ); if($my_ ...
- 一致性Hash算法说明
本文章比较好的说明了一致性Hash算法的概念 Hash算法一般分为除模求余和一致性Hash1.除模求余:当新增.删除机器时会导致大量key的移动2.一致性Hash:当新增.删除机器时只会影响到附近的k ...
- python测试开发django-15.查询结果转json(serializers)
前言 django查询数据库返回的是可迭代的queryset序列,如果不太习惯这种数据的话,可以用serializers方法转成json数据,更直观 返回json数据,需要用到JsonResponse ...
- Netty入门实例及分析
什么是netty?以下是官方文档的简单介绍: The Netty project is an effort to provide an asynchronous event-driven netwo ...
- 霍夫曼编码(Huffman Coding)
霍夫曼编码(Huffman Coding)是一种编码方法,霍夫曼编码是可变字长编码(VLC)的一种. 霍夫曼编码使用变长编码表对源符号(如文件中的一个字母)进行编码,其中变长编码表是通过一种评估来源符 ...
- 以绑定的方式来启动service
先说下原理,之前我们的启动service就是用startService来启动的,这是显式启动.启动后我们无法得到service中的数据,也无法知道它执行的状态,如果我们要启动它的activity和它建 ...
- TextView中文文档
十分感谢农民伯伯的翻译:http://www.cnblogs.com/over140/archive/2010/08/27/1809745.html xml 属性: 属性名称 描述 android: ...
- GridView和SimpleAdapter实现网格布局
android:horizontalSpacing 元素之间的水平间距 android:verticalSpacing 元素之间的垂直间距 android:numColumns ...