淘先锋技术网

首页 1 2 3 4 5 6 7

在Java中,关于锁机制的实现主要可分为两种:悲观锁和乐观锁。其中,使用synchronized实现的锁即为悲观锁,而使用ReentrantLock和其它一些类库实现的锁则是排他锁。

悲观锁

悲观锁的基本思路是:假设最坏的情况,即数据一定会出现冲突,所以在每次访问共享资源时,都会加上排它锁(即synchronized)。这样做虽然能保证数据安全,但同时也会导致性能下降。

//同步代码块
synchronized(lock){
//操作共享资源
}

排他锁

排他锁是一种更灵活的锁机制。ReentrantLock就是一种实现排他锁的类,在Java SE 5.0中引入了它。相较于悲观锁,排他锁允许多个线程同时读取相同的共享资源,但在写的时候,必须加锁,以保证只有一个写线程进入临界区。

//申请锁
ReentrantLock lock = new ReentrantLock();
//加锁
lock.lock();
try{
//执行等价于同步块的操作
}finally{
//释放锁
lock.unlock();
}

总结

悲观锁的锁粒度大,可以保证数据安全,但是性能较差,不适合高并发的场景。排他锁相较于悲观锁更加灵活,可以根据实际情况进行加锁,提高了性能和灵活性。