1.Synchronized关键字简单介绍
synchronized 是 Java 中用来实现同步的关键字,它可以应用于方法或代码块中。主要作用是确保多个线程在访问共享资源时能够按照既定的顺序执行,避免出现竞态条件(Race Condition)和数据不一致的情况。
2.synchronized关键字的几个重要功能
(1)实现同步:synchronized 关键字可以确保在同一时刻最多只有一个线程可以执行被 synchronized 修饰的方法或代码块。这样可以避免多个线程同时访问共享资源而导致的数据不一致或其他问题。
(2)对象锁:当synchronized修饰一个方法时,它锁定的是当前对象实例(即 this 对象),当synchronized修饰一个代码块时,可以指定锁定的对象。多个线程访问同一个对象时,只有一个线程能够获取到该对象的锁,其他线程会被阻塞,直到锁被释放。
(3)原子性:synchronized 关键字保证了被锁定的方法或代码块的执行是原子性的,即在同步块中的所有操作要么全部执行完毕,要么都不执行。
(4)阻塞和等待:当一个线程尝试获取一个已被其他线程持有的锁时,它会进入阻塞状态,直到获取到锁才能继续执行。其他线程在等待锁的释放时也会进入等待状态。
3.lock接口
(1).锁机制:Lock接口以及其实现类,如ReentrantLock,提供了一种可替代synchronized关键字的机制,用于实现线程同步和互斥。与synchronized相比,Lock提供了更多的灵活性和功能
(2)显式控制:使用Lock可以显式地获取锁和释放锁,这与synchronized相比更灵活。例如,在使用ReentrantLock时,可以使用lock()方法获取锁,使用unlock()方法释放锁。
(3)可中断性:与synchronized不同,Lock接口提供了一种可中断的锁获取方式,即线程在获取锁时可以响应中断。这可以避免线程长时间阻塞而无法中断的情况。
(4)条件变量:Lock接口提供了与锁关联的条件变量,可以用于线程之间的协调和通信。通过Condition接口的await()和signal()等方法,可以实现更高级别的线程等待和唤醒机制。
(5)可重入性:与synchronized一样,ReentrantLock支持线程的重入,即同一个线程可以多次获取同一把锁而不会造成死锁。