`
ryanflyer
  • 浏览: 102405 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

多线程之ReentrantReadWriteLock

 
阅读更多

ReentrantReadWriteLock类

package com.zhang.concurrent;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
  
/**
 * TODO Document TestReentrantReadWriteLock
 * <p />
 *
 * @author Administrator
 */
public class TestReentrantReadWriteLock {  
  
    public static void main(String[] args) {  
        testReadLock();  
      //testWriteLock();  
    }  
      
    public static void testReadLock() {  
       final ReadWriteLockSampleSupport support = new ReadWriteLockSampleSupport();  
        support.initCache();  
          
        Runnable runnable = new Runnable() {  
            public void run() {
                System.out.println(support.get("test"));
                  
            }  
        };  
          
        new Thread(runnable).start();  
        new Thread(runnable).start();  
          
        new Thread(new Runnable() {  
            public void run() {  
                support.put("test", "test");  
            }  
        }).start();  
        
        new Thread(new Runnable() {  
            public void run() {  
                support.put("haha", "haha");  
            }  
        }).start(); 
    }  
      
    public static void testWriteLock() {  
       final ReadWriteLockSampleSupport support = new ReadWriteLockSampleSupport();  
        support.initCache();  
          
        new Thread(new Runnable() {  
            public void run() {  
                support.put("key1", "value1");  
            }  
        }).start();  
          
        new Thread(new Runnable() {  
            public void run() {  
                support.put("key2", "value2");  
            }  
        }).start();  
          
        new Thread(new Runnable() {  
            public void run() {  
                support.get("key1");  
            }  
        }).start();  
    }  
}  
  
class ReadWriteLockSampleSupport {  
    private final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();  
    private final Lock readLock = lock.readLock();  
    private final Lock writeLock = lock.writeLock();  
      
    private volatile  boolean completed = false;  
    private Map<String,String> cache = new ConcurrentHashMap<String, String>();  
      
    public void initCache() {  
        readLock.lock();  
        if(!completed) {  
            // Must release read lock before acquiring write lock  
            readLock.unlock(); // (1)  
            writeLock.lock();  // (2)  
            if(!completed) {  
                completed = true;  
            }  
            // Downgrade by acquiring read lock before releasing write lock  
            readLock.lock();    // (3)  
            writeLock.unlock(); // (4) Unlock write, still hold read  
        }  
          
        System.out.println("empty? " + cache.isEmpty());  
        readLock.unlock();  
    }  
      
    public String get(String key) {  
        readLock.lock();  
        System.out.println(Thread.currentThread().getName() + " read.");  
        startTheCountdown();  
        try{  
            return cache.get(key);  
        }  
        finally{  
            readLock.unlock();  
        }  
    }  
      
    public String put(String key, String value) {  
        writeLock.lock();  
        System.out.println(Thread.currentThread().getName() + " write.");  
        startTheCountdown();  
        try{  
            return cache.put(key, value);  
        }  
        finally {  
            writeLock.unlock();  
        }  
    }  
      
    /** 
     * A simple countdown,it will stop after about 5s.  
     */  
    public void startTheCountdown() {  
        long currentTime = System.currentTimeMillis();  
        for(;;) {  
            long diff = System.currentTimeMillis() - currentTime;  
            if(diff > 5000) {  
                break;  
            }  
        }  
    }  
}  
 
分享到:
评论

相关推荐

    java多线程设计模式_java_设计模式_多线程_多线程课题_

    Java多线程设计模式是Java开发中的核心概念,它涉及到如何高效、安全地在多个执行线程之间共享资源和协调任务。设计模式是解决特定问题的成熟方案,它们是编程经验的结晶,可以帮助开发者在面临多线程挑战时快速找到...

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

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

    Java多线程 ReentrantReadWriteLock原理及实例详解

    - **可重入性**:与ReentrantLock类似,ReentrantReadWriteLock支持锁的可重入特性,即线程可以多次获取同一类型的锁(读锁或写锁),而不会被自己阻塞。 - **公平性**:ReentrantReadWriteLock可以设置为公平模式...

    java多线程经典案例

    Java多线程是Java编程中的重要概念,它允许程序同时执行多个任务,极大地提升了程序的效率和性能。在Java中,实现多线程有两种主要方式:通过实现Runnable接口或者继承Thread类。本案例将深入探讨Java多线程中的关键...

    java多线程之并发锁

    Java 多线程之并发锁 Java 中的多线程编程是指在一个程序中同时运行多个线程,以提高程序的执行效率和响应速度。在多线程编程中,线程间的同步是非常重要的,因为不同的线程可能会同时访问同一个共享资源,导致数据...

    Java 多线程与并发(12-26)-JUC锁- ReentrantReadWriteLock详解.pdf

    在Java多线程并发编程中,ReentrantReadWriteLock(可重入读写锁)是一个重要的同步工具,它属于Java并发包(java.util.concurrent.locks)中的一个类。这个锁提供了比标准的synchronized关键字更细粒度的控制,允许...

    多线程面试题

    在计算机科学中,多线程是一种允许一个进程同时执行多个线程的技术,目的是为了提高程序的执行效率。多线程面试题往往会围绕线程的概念、特性、线程安全、锁机制以及多线程编程中可能遇到的问题和解决方案进行提问。...

    多线程并发技术

    在现代软件开发中,多线程并发技术是提高程序性能和响应速度的关键因素之一。随着计算机硬件的性能持续提升,程序也必须能够有效地利用多核处理器来实现真正的并行处理。JVM(Java虚拟机)作为Java应用程序的运行...

    java多线程设计模式详解(PDF及源码)

    《Java多线程设计模式详解》是一本深入探讨Java并发编程和设计模式的专业书籍,它涵盖了多线程环境下的各种核心概念、最佳实践以及常见问题的解决方案。这本书旨在帮助开发者在实际开发过程中更好地理解和应用多线程...

    多线程相关

    在IT领域,多线程是程序设计中的一个重要概念,它允许程序同时执行多个任务,从而提高了计算机系统的资源利用率和程序的执行效率。本篇将详细探讨多线程相关的知识点,结合给定的标签"源码"和"工具",我们将讨论多...

    人工智能-项目实践-多线程-多线程与高并发.zip

    此外,同步机制是多线程编程中的关键,包括互斥锁(synchronized关键字)、读写锁(ReentrantReadWriteLock)、条件变量(Condition)等,它们确保了共享数据在多线程环境下的安全性。避免死锁和活锁也是多线程编程...

    java多线程、锁的教程跟案例

    Java多线程与锁是Java并发编程中的核心概念,它们对于构建高效、可扩展的并发应用程序至关重要。在Java中,多线程允许程序同时执行多个任务,提高CPU的利用率,而锁则是用来控制多线程间共享资源的访问,确保数据的...

    Java 多线程与并发编程总结.doc

    Java多线程与并发编程是Java开发中不可或缺的一部分,它涉及到如何高效地利用CPU资源,实现并发执行多个任务。在操作系统层面,多线程是为了提高系统利用率,使得多个任务能够"同时"执行,但实际上,由于CPU的时钟...

    java多线程设计模式

    多线程设计模式是解决多线程问题的有效方案之一。下面介绍几种常见的Java多线程设计模式及其应用场景: 1. **生产者-消费者模式**: - 这是一种经典的多线程模型,用于解决多线程之间的通信问题。 - 生产者负责...

    多线程同步

    在计算机编程中,多线程同步是一个至关重要的概念,特别是在处理并发执行的任务时。多线程操作使得程序能够同时执行多个不同的任务,从而提高效率和响应速度。在本例中,"多线程同步"的标题暗示我们关注的是如何在多...

    Netty多线程并发编程

    Netty多线程并发编程知识点总结 Netty多线程并发编程是指在Netty框架中使用多线程技术来实现高性能、高并发的网络编程。下面是关于Netty多线程并发编程的知识点总结: 一、 JAVA 内存模型与多线程编程 在Java中,...

    笔记16-JAVAEE之多线程进阶

    Java 多线程进阶 - 锁策略与读写锁 在 Java 多线程编程中,锁策略和读写锁是两个非常重要的概念。本文将对 Java 多线程进阶中的锁策略和读写锁进行详细介绍。 锁策略 在多线程编程中,锁策略是一个非常重要的概念...

    多线程编程之三 讲解+例程

    "多线程编程之三.pdf"文档可能提供了更详细的理论解释和案例分析,帮助你巩固和扩展多线程编程的知识。 总之,多线程编程中的线程间通信是理解和编写高效并发程序的关键。通过学习和实践,我们可以有效地管理线程的...

    java多线程安全性基础介绍.pptx

    java多线程安全性基础介绍 线程安全 正确性 什么是线程安全性 原子性 竞态条件 i++ 读i ++ 值写回i 可见性 JMM 由于cpu和内存加载速度的差距,在两者之间增加了多级缓存导致,内存并不能直接对cpu可见。 ...

Global site tag (gtag.js) - Google Analytics