在Java中,关于锁机制的实现主要可分为两种:悲观锁和乐观锁。其中,使用synchronized实现的锁即为悲观锁,而使用ReentrantLock和其它一些类库实现的锁则是排他锁。
悲观锁
悲观锁的基本思路是:假设最坏的情况,即数据一定会出现冲突,所以在每次访问共享资源时,都会加上排它锁(即synchronized)。这样做虽然能保证数据安全,但同时也会导致性能下降。
//同步代码块 synchronized(lock){ //操作共享资源 }
排他锁
排他锁是一种更灵活的锁机制。ReentrantLock就是一种实现排他锁的类,在Java SE 5.0中引入了它。相较于悲观锁,排他锁允许多个线程同时读取相同的共享资源,但在写的时候,必须加锁,以保证只有一个写线程进入临界区。
//申请锁 ReentrantLock lock = new ReentrantLock(); //加锁 lock.lock(); try{ //执行等价于同步块的操作 }finally{ //释放锁 lock.unlock(); }
总结
悲观锁的锁粒度大,可以保证数据安全,但是性能较差,不适合高并发的场景。排他锁相较于悲观锁更加灵活,可以根据实际情况进行加锁,提高了性能和灵活性。