发布时间:2023-01-17 17:00
ok,大家看到这个题,可以先理解下,这里启动了两个线程,a 和 b,但是虽然说 a 在 b 之前 start,不一定就可以保证线程 a 的逻辑,可以先于线程 b 执行。
所以,这里的意思是,线程 a 和 b,执行顺序互不干扰,我们不应该假定其中一个线程可以先于另外一个执行。
另外,既然是面试题,那常规做法自然是不用上了,比如让 b 先 sleep 几秒钟之类的,如果真这么答,那可能面试就结束了吧。
好,我们下面开始分析解法。
程序里定义了一个全局变量,var = 1。
线程a会修改这个变量为2,线程b则在变量为2时,执行自己的业务逻辑。
那么,这里首先,我们要做的是,先讲var使用volatile修饰,保证多线程操作时的可见性。
public static volatile int var = 1;
经过前面的可见性保证的分析,我们知道,要想达到目的,其实就是要保证:
a中的对var+1的操作,需要先于b执行。
但是,现在的问题是,两个线程同时启动,不知道谁先谁后,怎么保证 a 先执行,b 后执行呢?
让线程 b 先不执行,大概有两种思路:一种是阻塞该线程,一种是不阻塞该线程。阻塞的话,我们可以想想,怎么阻塞一个线程。
大概有下面这些方法: