`

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();
        }
    }
}

 欢迎大家给出意见!

0
0
分享到:
评论
2 楼 shi2huang 2012-09-01  
注意:write锁可以获取read锁,但是read锁不能获取write锁 这个意思不太懂噢。还有那个顺序变化了为什么结果也变化了呢?求指教。
1 楼 天下无贼 2012-03-21  
交给数据库处理好了

相关推荐

Global site tag (gtag.js) - Google Analytics