1、并发编程的两大问题:多线程之间如何通信以及多线程之间如何同步
2、线程之间的通信机制包含:共享内存和消息传递
3、保证现成的安全是在承接上次线程写完之后再读
4、(面试点)java线程的通信方式:
①、volatile
读锁,轻锁,修饰变量的。写后读,只保证读一定是正确的,但是不保证写。
应用场景:volatile只读变量是正确的,多线程下的i++,操作是会发生错误的
②等待/通知机制
wait()和notify()机制
③、join()
要想让主线程在线程之后执行,要使用join函数,让之后的线程在该线程之后在执行
④、theadLocal(map集合)
线程之内的才有效,如果A线程放入ThreadLocal变量,那么只有线程A的方法才能访问到ThreadLocal内的变量,而线程B线程无法访问ThreadLocal内的变量
5、伪代码注释@override表示重写
- 可以当注释用,方便阅读;
- 编译器可以给你验证@Override下面的方法名是否是你父类中所有的,如果没有则报错。例如,你如果没写@Override,而你下面的方法名又写错了,这时你的编译器是可以编译通过的,因为编译器以为这个方法是你的子类中自己增加的方法。
6、对象.wait()进入等待状态,进入等待前必须先持有锁,让其他的线程进入阻塞态
进入等待的线程不会参与竞争,如果没有被唤醒,是不会参与竞争的。
7、同步队列:竞争锁失败后,线程会进入同步队列,当锁释放时还是会去竞争锁
阻塞队列:就算所有的进程都结束了,但是没有被唤醒,是不会去参与竞争锁的。
8、wait 进入等待状态, 会释放锁
sleep 进入睡眠状态, 不会释放锁