1. 程式人生 > >用java實現一個行鎖(RowLock)

用java實現一個行鎖(RowLock)

java 版本的資料庫行鎖,使用wait/notify實現,當然可以使用別的方式如Lock下的await/signal

需求使用java寫一個類,這個類有一個lock(String identifier)方法,用於傳入一個唯一的標識標識資料庫的某一行或者某個集合的某一條記錄,當上鎖之後,如果不適用unLock(String identifier)方法解鎖,那麼用於就不能訪問這一條資料

直接上程式碼:

package com.lyzx.test;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ConcurrentHashMap;

public class JavaRowLock{
    private ConcurrentHashMap<String,Object> lockedMap = new ConcurrentHashMap();

    public synchronized void lock(String id) throws InterruptedException{
        while(lockedMap.containsKey(id)){
            wait();
        }
        lockedMap.put(id,"");
    }

    public synchronized void unLock(String id){
        if(lockedMap.containsKey(id)){
            lockedMap.remove(id);
            notifyAll();
        }
    }

    public static void main(String[] args){
        JavaRowLock lock = new JavaRowLock();

        List<Runnable> arr = new ArrayList<>();

        for(int i = 0;i<100;i++){
            arr.add(new A1(lock,"A"));
        }

        for(int i=0;i<arr.size();i++){
            new Thread(arr.get(i),"A"+(i+1)).start();
        }
        try{Thread.sleep(1000);}catch(InterruptedException e){e.printStackTrace();}
    }
}

class A1 implements Runnable{
    private JavaRowLock lock;
    private String id;
    
    public A1(JavaRowLock lock,String id){
        this.lock = lock;
        this.id = id;
    }

    @Override
    public void run(){
        String threadName = Thread.currentThread().getName();
        try{
            lock.lock(id);
            System.out.println("執行緒:"+threadName+" 為["+id+"]加鎖");
            System.out.println("執行緒:"+threadName+" 執行業務程式碼");
        }catch(Exception e){
            e.printStackTrace();
        }finally{
            lock.unLock(id);
            System.out.println("執行緒:"+threadName+" 釋放鎖");
        }
    }
}