Java中锁和监视器有何区别
Java中锁和监视器有以下区别:1.基本概念不同;2.主要作用不同;3.执行机制不同。基本概念不同在于,锁是对象内存堆中头部的一部分数据,任何程序都可以使用它来协调对对象的多线程访问;而监视器是一种同步结构,它允许线程同时互斥(使用锁)和协作。
1.基本概念不同
逻辑上锁是对象内存堆中头部的一部分数据。JVM中的每个对象都有一个锁,任何程序都可以使用它来协调对对象的多线程访问。
而监视器是一种同步结构,它允许线程同时互斥(使用锁)和协作,即使用等待集(wait-set)使线程等待某些条件为真的能力。
2.主要作用不同
如果任何线程想要访问该对象的实例变量,那么线程必须拥有该对象的锁(在锁内存区域设置一些标志)。所有其他的线程试图访问该对象的变量,必须等到拥有该对象的锁的线程释放锁(改变标记)。
监视器是用来协调有多个线程调用当前对象的时的执行顺序,线程会block或者wait在一个对象的监视器上,可理解为监视器确保只有一个线程访问共享资源,所有期待获得锁的线程,在锁已经被其它线程拥有的时候,这些期待获得锁的线程就进入了监视器的entry set区域。
3.执行机制不同
一旦线程拥有一个锁,它可以多次请求相同的锁,但是在其他线程能够使用这个对象之前必须释放相同数量的锁。如果一个线程请求一个对象的锁三次,如果别的线程想拥有该对象的锁,那么之前线程需要“释放”三次锁。
所有曾经获得过锁,但是由于其它必要条件不满足而需要wait的时候,线程就进入了监视器的wait set区域。在wait set区域的线程获得Notify/notifyAll通知的时候,随机的一个Thread(Notify)或者是全部的Thread(NotifyALL)从监视器的wait set区域进入了entry set中。在当前拥有锁的线程释放掉锁的时候,处于该监视器的entryset区域的线程都会抢占该锁,但是只能有任意的一个Thread能取得该锁,而其他线程依然在entry set中等待下次来抢占到锁之后再执行。
实际上,锁可以理解是监视器机制的一种实现方式。每个对象都有一个监视器,获得了锁相当于获得了对象的监视器。当你写代码加synchronized(obj){}的时候,会插入monitorenter和monitorexit两个指令,当JVM执行到enter指令后就看obj的对象头。根据对象头的不同锁形态来决定自己的状态,是CAS尝试获取偏向锁,还是自旋,还是阻塞。而enter和exit只是作为出入口,即被锁定的代码块尝试获得锁和尝试释放锁。锁可以保证正确的同步。锁的不同形态规定了持有锁和未持有锁的时候线程的状态。
延伸阅读
Java中常见的锁有哪些
1.乐观锁:是一种乐观思想,即认为读多写少,遇到并发写的可能性低,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新时会判断此期间数据是否被更新。
2.悲观锁:就是悲观思想,即认为对同一数据的并发操作肯定会有问题, 所以悲观锁就是采用显式加锁的方式来解决问题, 悲观的认为不加锁的并发操作肯定会有事。
3.自旋锁:原理非常简单,如果持有锁的线程能在很短时间内释放锁资源,那么那些等待竞争锁的线程就不需要做内核态和用户态之间的切换进入阻塞挂起状态,它们只需自旋,等持有锁的线程释放锁后即可立即获取锁,这样就避免用户线程和内核的切换的消耗。
3.可重入锁:又叫递归锁, 它指的是同一个线程如果在外层获得锁时, 那么在进入内层方法时也会自动获得锁, java中的ReentrantLook和Synchronized都是可重入锁。
4.死锁:指的是不同的线程相互占用对方所需的共享资源不释放, 导致两个线程卡住, 无法运行, 两个线程都在等待对方释放自己需要的资源, 出现死锁时, 不会有异常错误等, 而是导致这些线程阻塞,无法运行, 在程序设计时应该尽量避免死锁问题。
5.读写锁:是一种锁实现,其特点是包括多个读者可以同时读、写者必须互斥(读写也互斥)、写者优先于读者。
6.分段锁:也是一种锁的思想,指的是将数据分段,进一步细化锁,在每个分段上单独加锁,用以提高并发效率。
7.共享锁:允许多个线程同时获取锁,并发访问共享资源,如:ReadWriteLock。
8.独占锁:也叫互斥锁, 锁只能被一个线程占用, 与其他线程互斥。java中的Synchronied和ReentrantLook都是独占锁,但是在ReadWritLock接口下的实现类。
9.公平锁:指当锁被释放后, 检查是否有线程在排队等待, 优先将锁释放给等待时间较长的线程。
10.非公平锁:锁被释放后,不考虑排队的情况,线程直接去尝试获得锁。java中的Synchronized是非公平锁,ReentrantLook默认是非公平锁。
除上述锁之外,还有同步锁、死锁,以及四种锁的状态,即无锁状态、偏向锁、轻量级锁和重量级锁,其具体内容,在此不再多加赘述。

