ReentrantReadWriteLock使用技巧

最近正在学习多线程,有这样的一个场景,假如我们需要在数据库中更新一条数据,并查询更新后的数据,假如我们不对该程序做并发控制,那么很容易出现数据混乱,例如,A线程将数据改成了1,正准备去查询更新后的结果,此时,B线程又去数据库将数据改成了2,那么A线程最后查询回来的数据是2,而不是自己刚改的1,所以我们很有必要加上并发的控制,代码示例如下:

package com.yonge.lock;

import java.util.concurrent.locks.ReentrantReadWriteLock;

public class Test extends Thread {

    public static int              count = 0;

    private ReentrantReadWriteLock lock;

    public Test(ReentrantReadWriteLock lock) {
        this.lock = lock;
    }

    @Override
    public void run() {
        lock.writeLock().lock();
        try {
            System.out.println("Thread:" + this.getName() + "     开始写...    Count:" + count++);
            sleep(500);
            System.out.println("Thread:" + this.getName() + "     +1结束...");
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            //先后顺序一定要这样写     注意:write锁可以获取read锁,但是read锁不能获取write锁
            lock.readLock().lock();
            lock.writeLock().unlock();
        }
        System.out.println("Thread:" + this.getName() + "     开始读...    Count:" + count);
        lock.readLock().unlock();
    }

    public static void main(String[] args) {

        ReentrantReadWriteLock lock = new ReentrantReadWriteLock();

        for (int i = 0; i < 50; i++) {
            new Test(lock).start();
        }
    }
}

 欢迎大家给出意见!

猜你喜欢

转载自yonge812.iteye.com/blog/1327878