首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 企业软件 > 行业软件 >

ReentrantReadWriteLock施用技巧

2012-08-25 
ReentrantReadWriteLock使用技巧最近正在学习多线程,有这样的一个场景,假如我们需要在数据库中更新一条数

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

?欢迎大家给出意见!

1 楼 天下无贼 2012-03-21   交给数据库处理好了

热点排行