重入

如果某个线程视图获得一个已经由它自己持有的锁,那么这个请求就会成功。
重入的一种实现方法是,为每个锁关联一个获取计数值和一个所有者线程。当计数值为0时,这个锁就被认为是没有被任何线程持有。当线程请求一个未被持有的锁时,JVM将记下锁的持有者,并且将获取计数器置位1。如果同一个线程再次获取这个锁,计数值将递增,而当线程退出同步代码块时,计数器会相应的递减。当计数值为0时,这个锁将被释放。

内置锁

Java提供了一种内置的锁机制来支持原子性:同步代码块(Synchronized Block)。每个Java对象都可以用作一个实现同步的锁,这些锁被称为内置锁(Intrinsic Lock)或监视器锁(Monitor Lock)。线程在进入同步代码块之前会自动获得锁,并且在退出同步代码块时自动释放锁,而不论是通过正常的控制路径退出,还是通过从代码块中抛出异常退出。获得内置锁的唯一途径就是进入由这个锁保护 的同步代码块或方法。

特性

  • 可重入

    用于代码块

    要点:
  1. 作为锁的对象需要考虑是否会被更新引用,如果变量的引用发生了改变,就会导致synchronized失效,然后其他线程就会进入原本没有结束的synchronized代码块。所以要使用final来修饰变量,使引用不发生改变。

    用于修饰方法

    以关键字synchronize来修饰的方法就是一种横跨整个方法体的同步代码块,其中该同步代码块的锁就是方法调用所在的对象。静态的synchronize方法以Class对象作为锁。