Java中的监视器和锁是重要的多线程编程概念,用于确保线程的互斥和同步,保证共享数据的安全性。在Java中,每个对象都有一个内置的监视器,称为锁。当一个线程在执行同步代码块或同步方法时,会自动获取该对象的锁,并释放锁时,该对象将成为可用状态。
public class MonitorAndLockDemo { private int count = 0; private Object lock = new Object(); // 定义一个锁对象 public void increment() { synchronized(lock) { // 对锁进行同步 count++; } } public void decrement() { synchronized(lock) { // 对锁进行同步 count--; } } }
上面的代码演示了如何使用监视器和锁实现线程同步。在increment和decrement方法中,加上了synchronized关键字,以确保同一时间只有一个线程能够访问这些方法,在代码块结束时释放锁,使其他线程能够获得锁进行操作。使用同步块而非同步方法,是为了实现更细粒度的控制。
除了使用内置的锁对象进行线程同步,Java还提供了其他的锁及同步工具类,如ReentrantLock类和Semaphore类等。
public class ReentrantLockDemo { private int count = 0; private ReentrantLock lock = new ReentrantLock(); // 定义一个可重入锁 public void increment() { lock.lock(); // 获取锁 try { count++; } finally { lock.unlock(); // 释放锁 } } public void decrement() { lock.lock(); // 获取锁 try { count--; } finally { lock.unlock(); // 释放锁 } } }
上面的代码演示了如何使用ReentrantLock类实现线程同步。
总之,Java中的监视器和锁是实现线程同步的重要工具,在多线程编程中需要加以注意和应用。