1.synchronized关键字:synchronized关键字是Java内置的同步机制之一,它可以用来修饰方法或代码块。当使用synchronized修饰方法时,该方法成为同步方法,只允许一个线程进入方法执行。而当使用synchronized修饰代码块时,需要指定一个对象作为锁,只有持有该锁的线程才能执行代码块。
public synchronized void synchronizedMethod() {
// 同步的代码块
}
public void someMethod() {
synchronized (lockObject) {
// 同步的代码块
}
}
2.ReentrantLock类:ReentrantLock是Java提供的Lock接口的具体实现类,它也可以实现线程的同步。与synchronized相比,ReentrantLock提供了更灵活的同步控制方式,并且支持公平锁和非公平锁。ReentrantLock需要手动获取锁和释放锁,因此需要在finally块中确保锁的释放。
Lock lock = new ReentrantLock();
public void someMethod() {
lock.lock();
try {
// 同步的代码段
} finally {
lock.unlock();
}
}
3.ReadWriteLock类:ReadWriteLock是Lock接口的另一个实现,它区分了读操作和写操作,允许多个线程同时读取共享资源,但在写操作时需要独占锁。ReadWriteLock有两个具体实现类:ReentrantReadWriteLock和StampedLock。
ReadWriteLock lock = new ReentrantReadWriteLock();
public void readMethod() {
lock.readLock().lock();
try {
// 读取共享资源
} finally {
lock.readLock().unlock();
}
}
public void writeMethod() {
lock.writeLock().lock();
try {
// 写入共享资源
} finally {
lock.writeLock().unlock();
}
}
注:除了上述方式外,Java还提供了其他同步机制,如Semaphore、CountDownLatch、CyclicBarrier等,它们可以根据具体的需求来选择合适的同步机制。无论使用哪种方式,同步控制的目的都是保证多个线程对共享资源的安全访问。