在Java中,synchronized关键字用于控制多线程对共享资源的访问,以保持数据的一致性和完整性。当你在方法上使用synchronized关键字时,可以选择以下两种方式来选择锁对象:
-
隐式锁(默认锁): 当你在方法上使用synchronized关键字时,没有明确指定锁对象,那么锁对象就是该方法所在的类的实例(即this)。这种情况下,锁对象是隐式的。这种锁也被称为非公平锁,因为线程获取锁的顺序是不确定的。
示例:
public class MyClass { public synchronized void myMethod() { // 同步代码 } }
-
显式锁(自定义锁): 你也可以使用显式锁,如java.util.concurrent.locks.Lock接口及其实现类(如ReentrantLock)来选择锁对象。这种方式可以让你更灵活地控制锁的行为,例如设置公平性、中断策略等。
示例:
import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; public class MyClass { private final Lock lock = new ReentrantLock(); public void myMethod() { lock.lock(); try { // 同步代码 } finally { lock.unlock(); } } }
在选择锁对象时,需要考虑以下几点:
- 如果方法不访问类的实例变量(即不需要同步),那么可以使用synchronized关键字,但要注意避免死锁。
- 如果方法需要访问多个共享资源,可以考虑使用显式锁,以便更好地控制锁的行为。
- 如果方法需要访问外部资源(如文件、数据库等),可以考虑使用java.util.concurrent包中的高级并发工具类,如ReadWriteLock、Semaphore等。