多线程共享内存,需要解决两个问题:
- 竞态条件
- 内存可见性
可以使用Synchronized 解决上面的问题
从几个方面来理解synchronized
- 可重入性
- 内存可见性
- 死锁
可重入性是synchronized 一个特点,原理如下:
可重入锁是记录锁的持有线程,和持有数量来实现的,当被synchronized 保护的代码时 ,检查对象是否已经被锁,如果是,那么检查是否被当前的线程锁定。如果是,增加持有数量,如果不是被当前线程锁定,才加入等待队列,当释放锁时,减少持有数量,当数量变为0时才释放这个锁。
内存可见性
synchronized 处理保证原子操作外,还可以保证内存可见性。在释放锁的时候,内存会写回内存,获得锁,都会从内存中读取最新的数据。相对volatile 来说,synchronized保持可见性的成本比较高。
提个问题,volitale 内存可见性是怎么实现的?什么是指令重排?
死锁
举个例子,A,B两个线