一、前言
在同一个jvm进程中时,可以使用JUC提供的一些锁来解决多个线程竞争同一个共享资源时候的线程安全问题,但是当多个不同机器上的不同jvm进程共同竞争同一个共享资源时候,juc包的锁就无能无力了,这时候就需要分布式锁了。常见的有使用zk的最小版本,redis的set函数,数据库锁来实现,本节我们谈谈使用数据库悲观锁机制来实现一个分布式锁。
二、使用数据库悲观锁实现不可重入的分布式锁
这个比较简单,先来看代码:
public class DBdistributedLock{
private DataSource dataSource;
private static final String cmd = "select * from lock where uid = 1 for update";
public DBdistributedLock(DataSource ds){
this.dataSource = ds;
}
public static interface CallBack{
public void doAction();
}
public void lock(CallBack callBack){
Connection conn = null;
PreparedStatement stmt = null;
ResultSet rs = null;
try {
//try get lock
System.out.println(Thread.currentThread().getN