五分钟看穿 Java 并发相关概念,并发原来如此简单,linux 学习步骤
[](
)2.并行(Parallel)、并发(Concurrent)与多线程(Multithreading)
====================================================================================================================
并行是指多个任务在同一时刻进行。并发是指多个任务在同一时间段内发生。
并行是物理上的同时发生,而并发是逻辑上的同时发生。
体现在程序上: 并行是指多个 CPU 内核在同一时刻,同时运行多个任务。并发是指单个 CPU 内,通过 CPU 调度算法,让用户感觉在同时运行多个任务。
更形象的说法: 并行是指两队人员同时使用两台咖啡机。并发是指两队人员交替使用同一台咖啡机。—-Erlang 之父 Joe Armstrong。
/format,png)
多线程即多个线程,一般只多个同时在运行的单线程。
如果是在单核 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 秒
评论