对同步监视器的理解 - Java

在 JAVA 虚拟机中,每个对象通过某种逻辑关联监视器,为了实现监视器的互斥功能,每个对象都关联着一个锁,这个锁在操作系统书籍中称为“信号量”。

 

如果一个线程拥有了某些数据的锁,其他的线程则无法获得锁,直到这个线程释放了这个锁。在多线程中,如果任何时候都是我们自己来写这个信号量,显然不是很方便,幸运的是,JVM 为我们自动实现了这些。

 

为了使数据不被多个线程访问,java 提供了同步块以及同步方法等实现,一旦一段代码被嵌入到一个 synchronized 关键字中,意味着放入了监视区域,JVM 在后台会自动为这段代码实现锁的功能。

 

监视器和锁在 Java 虚拟机中是一块使用的。监视器监视一块同步代码块,确保一次只有一个线程执行同步代码块。每一个监视器都和一个对象引用相关联。线程在获取锁之前不允许执行同步代码。

 

synchronized (Object obj) {
... // 同步代码块
}

 

这个语法的意思就是进入代码块之前先将资源 obj 锁定住,只有锁定住资源 obj 的线程才有资格执行后面的代码块,代码块执行完毕之后线程就释放了对资源 obj 的锁定,然后 obj 就可以被其它线程锁定并使用。

 

通俗地讲就是只有获取对 obj 的锁定之后才能用后面代码块中的代码访问 obj 资源,否则就无法访问 obj 也无法执行后面的代码,只能让线程停滞在那里等待其它线程解除对 obj 的锁定。

 

posted @ 2022-04-11 14:22  Light_cone  阅读(272)  评论(0编辑  收藏  举报