内存可见性
数据除了存放到内存,还会被缓存到CPU的寄存器以及各级缓存中,当访问一个变量时,可能直接从寄存器或缓存中获取,当修改一个变量时,也可能是先写入缓存,稍后才会同步更新到内存中。
在多线程尤其是在多CPU情况下,可能会出现以下情况:
- 一个线程更新了变量,而数据没有同步到内存中,导致另一个线程拿不到变量最新的值。
- 线程可能直接从缓存中拿数据,而没有从内存中拿,导致拿到的数据不是最新的。
内存可见性解决方法
- 使用volatile关键字
- 使用synchronized关键字或显式锁同步
线程优点
- 充分利用多CPU的计算能力
- 让CPU和网络资源,硬盘协作更有效率,当一个线程处于IO操作时,另一个线程可以利用CPU
- 在用户界面(GUI)应用程序中,保持程序的响应性,界面和后台任务通常是两个不同的程序
线程缺点
线程调度和切换是有成本的。在线程切换时,需要保存线程的上下文,上下文包括当前寄存器的值,程序计数器等
Synchronized
- Synchronized实例方法保护的是同一个对象的方法调用,确保同时只能有一个线程执行。synchronized实例方法保护的是当前对象,即this,this对象有一个锁和一个等待队列,锁只能被一个线程持有,其他试图获得同样锁的会被加入等待队列,线程状态为BLOCKED。当持有锁的线程释放锁后,会从等待队列中唤醒一个线程。