`

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

相关推荐

    Java性能优化技巧集锦

    掌握锁的优化策略,如读写锁(ReentrantReadWriteLock)。 7. **避免冗余计算**:对计算量大的操作,可以考虑缓存结果,如使用Memoization策略。同时,理解并运用lazy initialization。 8. **IO操作优化**:使用...

    JAVA面试体系一条龙(含笔试与各种注意事项与标准模板)

    3. Lock接口:ReentrantLock、ReentrantReadWriteLock等高级锁的使用。 四、IO与NIO 1. 流的概念:字节流和字符流,以及它们的读写操作。 2. 文件操作:File类的基本使用,以及随机访问文件。 3. NIO:非阻塞I/O,...

    java多线程经典案例

    通过分析并实践`threadTest`案例,我们可以深入理解Java多线程的原理和使用技巧,为编写高效并发程序打下坚实基础。同时,也要注意多线程编程中的死锁、活锁和饥饿等问题,合理设计线程间的交互,避免出现不可预期的...

    JAVA并发编程实践

    5. **锁机制**:深入理解synchronized关键字,包括可重入锁、互斥锁、读写锁等,以及ReentrantLock、ReentrantReadWriteLock的使用。 6. **并发模式**:如生产者-消费者模式、读者-写者模式、工作窃取模式等,以及...

    Java性能优化比较

    在Java开发过程中,了解并掌握这些优化技巧可以显著提高应用的响应速度和资源利用率。 首先,我们关注的是代码层面的优化。这包括避免冗余计算、减少不必要的对象创建、使用适当的数据结构和算法。例如,对于频繁...

    国内几个公司的Java面试试题

    - Lock接口:ReentrantLock和ReentrantReadWriteLock的使用,比较与synchronized的区别。 6. **IO流** - 字节流和字符流的区别,以及它们的常用类如FileInputStream、FileOutputStream、BufferedReader、...

    java concurrent in practive

    另外,`java.util.concurrent.locks`包提供了可重入锁`ReentrantLock`和读写锁`ReentrantReadWriteLock`,它们比`synchronized`更灵活,允许更细粒度的锁控制。 死锁、活锁和饥饿是并发编程中常见的问题,书中会...

    并发编程面试专题.pdf

    在实现高效缓存时,可以使用`ReentrantReadWriteLock`,允许多个读取者同时访问,但写入者独占,确保数据一致性。 3) **wait()与sleep()区别**:`wait()`使线程进入等待状态并释放持有的锁,而`sleep()`则不释放锁...

    java多线程设计模式详解

    为了更好地理解和应用这些模式,提供的源码详解文件“java多线程设计模式详解”将详细展示各种模式的实现细节,通过分析源码,读者可以深入掌握Java多线程编程的核心技巧。务必花时间仔细阅读和实践,这对于提升并发...

    java并发编程从入门到精通

    本文将深入探讨Java并发编程的基础知识、重要概念以及实践技巧,旨在帮助初学者逐步精通这一领域。 首先,我们需要理解"并发"的概念。并发是指多个任务在同一时间段内同时进行,但并不意味着它们一定是并行的。在...

    SharedPreferences的形式在缓存中维护两个List,对其进行增删等操作

    虽然`SharedPreferences`的设计初衷不是用来存储复杂的数据结构,比如`List`,但通过一些技巧,我们仍然可以在缓存中利用`SharedPreferences`维护两个`List&lt;String&gt;`。 `SharedPreferences`提供了键值对的存储方式...

    concurrent_programming_in_java_design_principles_a_Currency_desi

    4. **设计模式**:如生产者消费者模式(BlockingQueue)、读写锁模式(ReentrantReadWriteLock)等,这些都是在并发编程中常见的设计模式。 5. **原子操作**:Atomic类库提供了原子变量,如AtomicInteger,它们的...

    Java并发编程进阶练习代码

    本练习集专注于提升你在Java并发编程中的技巧,通过一系列逐步进阶的代码实例,帮助你掌握从基础到高级的并发概念。 首先,我们从“线程安全”开始。线程安全是指在多线程环境下,一个类或方法能够正确地处理并发...

    [中文]Java并发编程的艺术pdf

    - **读写锁**:`ReentrantReadWriteLock`允许多个读取者同时访问,但在写入时会独占资源,提高了并发性能。 3. **并发工具类** - **并发容器**:如`ConcurrentHashMap`、`CopyOnWriteArrayList`和`...

    java哲学家就餐代码实例

    然而,实际的解决方案可能更复杂,需要考虑到更多的并发控制策略,例如使用信号量(Semaphore)或者读写锁(ReentrantReadWriteLock)。此外,还可以使用非阻塞的并发控制技术,如Java并发库中的`java.util....

    计算机后端-Java-Java高并发从入门到面试教程-用拆分思路.zip

    本教程“Java高并发从入门到面试教程-用拆分思路”旨在帮助开发者从基础知识开始,逐步掌握Java在高并发环境下的编程技巧,并为求职面试做好准备。以下是本教程可能涵盖的关键知识点: 1. **并发基础**:首先,了解...

    java 多线程编程实战指南(核心 + 设计模式 完整版)

    《Java多线程编程实战指南》这本书深入浅出地讲解了Java多线程的核心概念和实战技巧,分为核心篇和设计模式篇,旨在帮助开发者掌握并应用多线程技术。 1. **线程基础** - **线程的创建**:Java提供了两种创建线程...

    Java多线程设计模式(附带书中源码)

    4. **读写锁模式**:Java的`ReentrantReadWriteLock`提供了读写锁,允许多个读操作并发执行,但在写操作时,所有读写操作都会阻塞,从而保证数据的一致性。这种模式提高了对共享资源的并发访问效率。 5. **条件变量...

    MCA 多线程&高并发.zip

    《MCA多线程&高并发》...本教程覆盖了多线程与高并发的基础理论、实践技巧以及优化策略,适合Java初学者和有一定经验的开发者深入学习,通过学习,你将具备处理复杂并发问题的能力,提升你的编程技能和项目实战水平。

Global site tag (gtag.js) - Google Analytics