📜  Java并发中Lock和Monitor的区别(1)

📅  最后修改于: 2023-12-03 15:02:04.591000             🧑  作者: Mango

Java并发中Lock和Monitor的区别

在Java并发编程中,Lock和Monitor都是用来协调线程并发访问共享资源的机制。本文将介绍它们的区别。

Monitor

Monitor在Java中是通过synchronized关键字实现的。当线程进入synchronized块时,它会自动获得Monitor锁,也就是说,这个线程拥有这个共享资源的所有权,其他线程只能等待这个线程释放锁后才能访问该资源。

public class Counter {
    private int count = 0;
    
    public synchronized void increment() {
        count++;
    }
    
    public synchronized int getCount() {
        return count;
    }
}

在上面的代码中,synchronized关键字用于对共享资源的访问进行同步。因为synchronized会经过JVM编译器的优化,所以其性能要比Lock好,但是synchronized是独占锁,也就是说,只有一个线程可以持有锁,而且它的锁的释放是由JVM自动进行的。

Lock

Lock是Java5中新增的一个机制,它提供了跟Monitor类似的功能,但是具有更高的可扩展性和灵活性。Lock是一个接口,可以由程序员自己实现Lock接口的具体操作。

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class Counter {
    private int count = 0;
    private Lock lock = new ReentrantLock();
    
    public void increment() {
        lock.lock();
        try {
            count++;
        } finally {
            lock.unlock();
        }
    }
    
    public int getCount() {
        lock.lock();
        try {
            return count;
        } finally {
            lock.unlock();
        }
    }
}

在上面的代码中,通过Lock接口中的lock()方法和unlock()方法来实现对共享资源的访问进行同步。与synchronized关键字不同的是,Lock是可重入锁,也就是说,同一个线程可以多次获取同一个Lock实例的锁,而且它的释放是由程序员自己来进行的。

除了ReentrantLock以外,Java中还提供了其他的Lock实现,例如ReadLock和WriteLock等,它们用于实现读写锁。

总结

Monitor和Lock都可以用于实现线程间的同步,但是它们的优缺点各有所长。程序员在使用的时候应该根据具体的应用场景来选择适合自己的同步机制。