对同步监视器的理解 - Java
在 JAVA 虚拟机中,每个对象通过某种逻辑关联监视器,为了实现监视器的互斥功能,每个对象都关联着一个锁,这个锁在操作系统书籍中称为“信号量”。
如果一个线程拥有了某些数据的锁,其他的线程则无法获得锁,直到这个线程释放了这个锁。在多线程中,如果任何时候都是我们自己来写这个信号量,显然不是很方便,幸运的是,JVM 为我们自动实现了这些。
为了使数据不被多个线程访问,java 提供了同步块以及同步方法等实现,一旦一段代码被嵌入到一个 synchronized 关键字中,意味着放入了监视区域,JVM 在后台会自动为这段代码实现锁的功能。
监视器和锁在 Java 虚拟机中是一块使用的。监视器监视一块同步代码块,确保一次只有一个线程执行同步代码块。每一个监视器都和一个对象引用相关联。线程在获取锁之前不允许执行同步代码。
synchronized (Object obj) { ... // 同步代码块 }
这个语法的意思就是进入代码块之前先将资源 obj 锁定住,只有锁定住资源 obj 的线程才有资格执行后面的代码块,代码块执行完毕之后线程就释放了对资源 obj 的锁定,然后 obj 就可以被其它线程锁定并使用。
通俗地讲就是只有获取对 obj 的锁定之后才能用后面代码块中的代码访问 obj 资源,否则就无法访问 obj 也无法执行后面的代码,只能让线程停滞在那里等待其它线程解除对 obj 的锁定。