1. Java 创建线程之后,直接调用 start()方法和 run()的区别?
启动一个线程是调用 start()方法,使线程所代表的虚拟处理机处于可运行状态,这意味着它可以由 JVM 调度并执行。这并不意味着线程就会立即运行。run()方法可以产生必须退出的标志来停止一个线程。
2. 线程 B 怎么知道线程 A 修改了变量?
volatile 修饰变量
synchronized 修饰修改变量的方法
wait/notify while 轮询
3. synchronized 和 Volatile、CAS 比较?
synchronized 是悲观锁,属于抢占式,会引起其他线程阻塞。volatile 提供多线程共享变量可见性和禁止指令重排序优化。CAS 是基于冲突检测的乐观锁(非阻塞)
4. 线程间通信,wait 和 notify 的理解和使用?
1 wait 和 notify 必须配合 synchronized 关键字使用。
2 wait 方法释放锁,notify 方法不释放锁。
3 还要注意一点 就是涉及到线程之间的通信,就肯定会用到 validate 修饰。
5. 定时线程的使用?
1、普通线程死循环2、使用定时器 timer
3、使用定时调度线程池 ScheduledExecutorService