在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(); } } } 在选择锁对象时,需要考虑以下几点: