public class SynchronizedExample {
private int count = 0;
public synchronized void increment() {
count++;
}
public int getCount() {
return count;
}
}
increment
方法被synchronized
修饰。当一个线程进入increment
方法时,它会获取this
对象(当前实例)的锁。其他线程如果也想调用increment
方法,就必须等待这个线程释放锁。 import java.util.concurrent.locks.ReentrantLock;
public class ReentrantLockExample {
private int count = 0;
private ReentrantLock lock = new ReentrantLock();
public void increment() {
lock.lock();
try {
count++;
} finally {
lock.unlock();
}
}
public int getCount() {
return count;
}
}
ReentrantLock
来实现悲观锁。在increment
方法中,首先通过lock.lock()
获取锁,然后在finally
块中通过lock.unlock()
释放锁,确保在任何情况下锁都能被正确释放。 version
)或者时间戳(timestamp
)。 class OptimisticLockExample {
private int value;
private int version;
public void updateValue(int newValue) {
// 先检查版本号
if (version == getVersionFromDB()) {
// 如果版本号一致,更新值和版本号
value = newValue;
version++;
updateDBValueAndVersion(value, version);
} else {
// 版本号不一致,可能有其他线程修改了数据,可以选择重试或者抛出异常
throw new ConcurrentModificationException("Data has been modified by other threads");
}
}
private int getVersionFromDB() {
// 从数据库中获取版本号的模拟方法
return version;
}
private void updateDBValueAndVersion(int newValue, int newVersion) {
// 更新数据库中的值和版本号的模拟方法
}
}
value
之前,都会检查version
是否和数据库中的版本号一致。如果一致,说明数据没有被其他线程修改,可以进行更新操作,并且更新后版本号加 1;如果不一致,说明数据已经被其他线程修改,根据业务需求可以选择抛出异常或者重试操作。Timestamp
类在精度上更准确(精确到毫秒),并且提供了一些与数据库交互更方便的方法。Date
类主要用于表示日期和时间,但在处理数据库相关操作时可能需要额外的转换。Calendar
类主要用于日期时间的计算和操作,如日期的加减等。因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- igbc.cn 版权所有 湘ICP备2023023988号-5
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务