Java乐观锁实现例子
时间: 2024-05-16 17:16:15 浏览: 102
java乐观锁原理与实现案例分析
5星 · 资源好评率100%
乐观锁是一种并发控制的方式,它认为并发访问的数据操作不会相互冲突,因此不需要阻塞等待其他线程释放锁。在Java中,可以使用版本号或时间戳等机制实现乐观锁。
下面是一个使用版本号实现乐观锁的例子:
```java
public class OptimisticLockDemo {
private int version = 0;
private String data = "init data";
public void update(String newData) {
// 保存当前版本号
int currentVersion = version;
// 模拟数据更新过程
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
// 如果期间版本号没有改变,说明数据没有被其他线程修改过,可以更新
if (currentVersion == version) {
System.out.println("Update data from " + data + " to " + newData);
data = newData;
version++;
} else {
System.out.println("Data has been modified by other thread, update failed.");
}
}
}
```
在这个例子中,`version` 用于记录数据的版本号,每次更新数据时先保存当前版本号,如果在更新过程中,其他线程没有修改数据,那么版本号不变,可以将新数据保存到对象中,并将版本号加1。如果在更新过程中,其他线程修改了数据,版本号就会变化,那么更新就会失败。
可以使用多个线程同时访问 `OptimisticLockDemo` 对象,观察乐观锁的效果:
```java
public class OptimisticLockTest {
public static void main(String[] args) {
final OptimisticLockDemo demo = new OptimisticLockDemo();
// 创建两个线程更新数据
new Thread(new Runnable() {
@Override
public void run() {
demo.update("data1");
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
demo.update("data2");
}
}).start();
}
}
```
可以看到,第一个线程成功更新了数据,而第二个线程更新失败,因为在更新过程中,数据被第一个线程修改了。
乐观锁虽然避免了阻塞等待其他线程释放锁的问题,但是需要额外的版本号或时间戳等机制来保证数据的正确性,因此适用于并发量不高、冲突不频繁的场景。
阅读全文