Java中悲观锁和乐观锁是用来解决多线程编程中的并发访问问题的一种机制。悲观锁是指一个线程在访问共享资源前获取锁,这样其他线程无法访问该资源,直到该线程释放锁,而乐观锁是指一个线程在访问共享资源时不会获取锁,而是假设其他线程不会修改该资源,从而不断尝试访问该资源,直到成功为止。
悲观锁实例
悲观锁是通过使用synchronized关键字来实现的,该关键字可以在任何代码块上使用,以保证在同一时间只有一个线程可以执行该代码块,从而避免多线程访问共享资源时出现的问题。下面是一个悲观锁的示例代码:
public class SynchronizedExample { private int count = 0; public synchronized void increment() { count++; } public int getCount() { return count; } }
上面的代码中,increment()方法是一个同步方法,在该方法中,count变量将被锁定,这样其他线程无法访问该变量,从而避免了多线程访问共享资源时出现的问题。
乐观锁实例
乐观锁是通过使用CAS(Compare-And-Swap)操作来实现的,CAS操作是一种原子操作,可以保证多线程之间的变量更新操作是原子性的,从而避免了多线程访问共享资源时出现的问题。下面是一个乐观锁的示例代码:
public class CASExample { private AtomicInteger count = new AtomicInteger(); public void increment() { count.getAndIncrement(); } public int getCount() { return count.get(); } }
上面的代码中,increment()方法使用AtomicInteger类的getAndIncrement()方法来实现,该方法是一个CAS操作,可以保证多线程之间的变量更新操作是原子性的,从而避免了多线程访问共享资源时出现的问题。
比较
在比较悲观锁和乐观锁时,要明确的是,它们都是用来解决多线程编程中的并发访问问题的一种机制。
- 悲观锁是指一个线程在访问共享资源前获取锁,这样其他线程无法访问该资源,直到该线程释放锁;
- 乐观锁是指一个线程在访问共享资源时不会获取锁,而是假设其他线程不会修改该资源,从而不断尝试访问该资源,直到成功为止。
从性能上来说,乐观锁的性能要优于悲观锁,因为悲观锁会导致线程的阻塞,而乐观锁不会。但是,乐观锁也有一个缺点,就是它的实现比较复杂,而且可能会出现ABA问题。