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
交给数据库处理好了