多线程访问共享资源的时候,须要注意两个问题:java
为了保证以上两点,须要用锁,也称为互斥量(mutex)。Java提供了关键字volatile和synchronized,为锁(互斥量)提供了支持。缓存
volatile能够理解为轻量级的synchronized,它保证了共享变量的可见性,即一个线程修改共享变量时,其余线程对这个修改是能够看见的,是能读到这个修改值的。volatile不会引发上下文的切换。
volatile的具体实现原理可简单地描述为:多线程
若是变量没有被声明为volatile,那么在上述第2步时,不会立刻写回内存,这样会使得其余线程以为x仍是有效的。线程
synchronized可用于同步方法和代码段。code
当同步的是普通方法时,锁的是当前实例对象。当在这个实例对象上调用了synchronized方法且未释放锁时,调用该实例对象上其余的synchronized方法时会阻塞。对象
public class test{ synchronized void f(){} synchronized void g(){} }