Java并发之同步&异步(个人屌丝版,有点乱,可以喷)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/cadi2011/article/details/84850172

0、并发的概念挺多的,对操作系统越是不熟,坑越多,那干脆对一些常见词汇先扫盲扫盲吧。

1、并发

白话文:一段时间内,多个线程、或进程同时执行(其实cpu切片不会同时,但是切换很快,像快枪手)

2、同步基本概念

比如有两个任务,那么他们是按照先后顺序,一个一个执行的

发出一个功能调用时,在没有得到结果之前,该调用就不返回或继续执行后续操作

3、异步基本概念

比如也有两个任务,他们执行的时候,几乎是同时进行的,不用一个一个方法的执行

一个异步过程调用发出后,调用者在没有得到结果之前,就可以继续执行后续操作。当这个调用完成后,一般通过状态、通知和回调来通知调用者。对于异步调用,调用的返回并不受调用者控制

4、方法是同步的,指多线程下方法的情况

是指该方法支持多线程,比如一个方法加了synchronized

5、方法体内是否也为同步,即指的是同步调用方法

a、方法调用一旦开始后,调用者必须等到同步方法返回后,才能继续后续的行为(此时称被调用的方法为同步方法)

b、就是发出一个功能调用时,在没有得到结果之前,该调用就不返回或继续执行后续操作(此时调用者本身是个同步方法)

6、方法是异步的,指多线程下方法的情况  

是指该方法不支持多线程,多个线程可以并行调用,将导致无法得到正确的值

7、方法体内是否为异步,即指的是异步方法,下面指的调用者为异步方法

a、当一个异步过程调用发出后,调用者在没有得到结果之前,就可以继续执行后续操作

b、当这个调用完成后,一般通过状态、通知和回调来通知调用者。对于异步调用,调用的返回并不受调用者控制

8、这里面有个概念,调用者本身、以及被调用者,其实还是一个方法,只是在不同的场景下,叫不同的名字

比如方法hello(),当hello()自己去运行时,hello()是调用者本身(这里奇葩啊,程序运行的时候,总会被调用啊,哪怕是入口方法呢,hello()运行时,肯定也是被调用的嘛)

当hello()被其他方法调用执行的时候,hello()就是被调用者

a、调用者本身可以是同步方法、也可以是异步方法

调用者A本身如果是同步方法,那它一定会等方法的返回值回来,再向下执行语句

如果调用者A是异步方法,当在执行一条语句,比如调用了hello()方法,此时调用者不等hello()方法的返回结果,,就开始执行下面的语句了,看下例子

b、被调用者B本身可以是同步方法、也可以是异步方法

如果被调用者B是同步方法,那么方法一定会一条语句语句的执行

如果被调用者B是异步方法,那么方法的某些语句在执行过程中,是不等返回结果,就会继续next条语句的执行

9、同步异步通常用来形容一次方法调用。

  • 同步方法调用一旦开始,调用者必须等到方法调用返回后,才能继续后续的行为。
  • 异步方法调用更像一个消息传递,一旦开始,方法调用就会立即返回,调用者就可以继续后续的操作。而,异步方法通常会在另外一个线程中,“真实”地执行着。整个过程,不会阻碍调用者的工作。

10、而上面说的同步方法,是从多线程维度考虑,全称我觉得应该是多线程同步方法,如果一个方法不加synchronized等,那么就是一个多线程异步方法

11、在Java中,如果都是单线程下,那么所有方法都是同步方法,跟你加synchroized等没啥关系,加不加也一样

12、举个例子

方法是个同步方法,多线程维度下

方法体内进行异步调用,新起一根线程

此时我们说printHello()方法是同步的,而里面具体的执行是异步的

   public static synchronized void printHello(){ //同步方法
        System.out.print("hello");

        new Thread(new TimerTask() { //异步调用,起一根线程去执行耗时任务,调用者不会等它执行完
            @Override
            public void run() {

            }
        }).start();

        System.out.print("continue print"); //输出的最后一条语句
    }

猜你喜欢

转载自blog.csdn.net/cadi2011/article/details/84850172