要保持状态的一致性,需要在单个原子操作中更新所有的相关的状态变量。
内置锁:通过内置锁来支持原子性,同步代码块(Synchronized Block)包括两个部分(1)锁的对象引用(2)锁保护的代码块
synchronized(lock){
}
静态的synchronized方法以Class对象作为锁。每个java对象都可以做一个实现同步的锁,这些锁成为内置锁或监视器锁。现场在进入同步代码块之前会自动获得锁,并在执行完退出代码块之后,无论是正常执行完,还是抛异常退出,都会施放锁。获得内置锁的唯一途径就是进入同步代码块。
内置锁相当于一个互斥体,这就意味着只有一个线程能持有这个锁。因此这个同步代码块将以原子的方式执行,其他现场不会干扰到同步代码块中执行。其他线程在试图获得已经正在有线程执行的内置锁的时候,这个线程将等待进入阻塞状态。
内置锁的重入
重入故名思意就是,当线程获得了内置锁,在次进入的时候,会直接进入,而不需要再次获得内置锁。在子类继承父类的同步方法的时候,子类会调用父类的方法。子类对象在调用重新的父类对象方法的时候,得到的都是同一个实例对象的锁,如果锁不是可以重入的,在第二次调用,也就是在调用父类方法的时候,也会试图得到该对象的锁,将会一直被阻塞,将发生死锁。而锁的可以重入的,就避免了死锁。