内容多有疏漏,有问题欢迎提出
目录:
- 串行和并行的区别;
- 阻塞和非阻塞的区别;
- 并发;
- 总结;
一、串行和并行的区别:
串行就是按照顺序依次把事情做完,并行是同时做多个事情,在java编程的角度来讲,并行就体现在多线程的使用上。
串行举例:
public class SynchronizationTest {
public static void main(String[] args) {
long cur = System.currentTimeMillis();
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 100000; j++) {
System.out.println("Hello World");
}
}
System.out.println(System.currentTimeMillis() - cur);
}
}
并行举例:
public class AsynchronizationTest {
public static void main(String[] args) throws InterruptedException {
long cur = System.currentTimeMillis();
AsynchronizationTest test = new AsynchronizationTest();
MyThread thread0 = test.new MyThread();
MyThread thread1 = test.new MyThread();
MyThread thread2 = test.new MyThread();
thread0.start();
thread1.start();
thread2.start();
thread0.join();
thread1.join();
thread2.join();
System.out.println(System.currentTimeMillis() - cur);
}
class MyThread extends Thread {
@Override
public void run() {
for (int j = 0; j < 100000; j++) {
System.out.println("Hello World");
}
}
}
}
二、阻塞和非阻塞的区别:
阻塞,就是某一线程占着资源不释放,知道它处理完成通知下一线程可以使用资源了,才可以向下执行。
非阻塞,就是某一线程执行过程中,另一线程也来访问这个资源,发现资源已经被占用了,于是立即返回去找其他资源。
举个例子,A要煮开书,起初他用普通烧水壶,烧水的过程中,他看一会儿电视,就去看一下谁有没有煮开,这就是阻塞的方式。后来A换了新家伙,买到了一个烧好水之后会叫并且会自动断电的电水壶,这样A就可以一边烧水一边安心的看电视,不用去观察水是否煮开,等到想用开水的时候去用就可以了,这就是非阻塞的方式。
三、并发:
在单CPU的情况下,并发是指多个线程在一个CPU中来回切换执行,本质上还是串行执行,现在的机器大部分都是多个CPU,每个CPU可以单独处理线程任务,这样也就做到了真正的并发处理。
并发的好处:
并发,顾名思义,就是多件事情同时去做,在讲求效率的当下,并发能极大地提高做事情的效率。
并发的缺点:
1、并发编程中任务之间的切换可能带来性能上额外的开销;
2、并发编程难以控制,就如同人一边开车一边看美女,很容易就因为分心撞到路边;
四、总结:
但是整体来讲,并发带来的效率提升远远超过它本身的难以控制,并发编程我们可以对它进行深入的了解,从而避免编程中遇到的坑。
这就需要我们从源头对并发得基础知识有深入的了解,下面一章,我们将从java的内存模型(JMM)开始讲起