`
dacoolbaby
  • 浏览: 1264711 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Java多线程包之读写锁

    博客分类:
  • Java
阅读更多

简单的并发控制可以通过synchronized关键字来完成。

synchronized通过锁定对象,从而实现并发的控制。

 

但是遇到一下一种情况,就会出现意想之外的结果。

 

一般来说,我们要实现写入和写入互斥,读取和写入互斥,读取和读取互斥,

在set和get方法加入sychronized修饰符:

 

public synchronized void set(int data) {...}      
public synchronized void get() {...} 

 

但是我们发现,虽然写入和写入互斥了,读取和写入也互斥了,但是读取和读取之间也互斥了,

不能并发执行,效率较低,用读写锁实现代码如下:

 

import java.util.Random;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;

public class ReadWriteLockTest {
    private int data;// 共享数据

    private ReadWriteLock rwl = new ReentrantReadWriteLock();

    public void set(int data) {
        
        rwl.writeLock().lock();// 取到写锁
        rwl.readLock().lock();
        try {
            System.out.println(Thread.currentThread().getName() + "准备写入数据");
            try {
                Thread.sleep(20);
            }
            catch (InterruptedException e) {
                e.printStackTrace();
            }
            this.data = data;
            System.out.println(Thread.currentThread().getName() + "写入" + this.data);
        } finally {
            rwl.writeLock().unlock();// 释放写锁
            rwl.readLock().unlock();
        }
    }

    public void get() {
        rwl.readLock().lock();// 取到读锁
        try {
            System.out.println(Thread.currentThread().getName() + "准备读取数据");
            try {
                Thread.sleep(20);
            }
            catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(Thread.currentThread().getName() + "读取" + this.data);
        } finally {
            rwl.readLock().unlock();// 释放读锁
        }
    }
    
    
    public static void main(String args[]){
        
        final ReadWriteLockTest test = new ReadWriteLockTest();
        
        new Thread() {
            public void run() {
               test.set(new Random().nextInt(15));
               test.get();
            };
        }.start();
        new Thread() {
            public void run() {
               test.set(new Random().nextInt(25));
               test.get();
            };
        }.start();
        new Thread() {
            public void run() {
               test.set(new Random().nextInt(35));
               test.get();
            };
        }.start();
    }
}

 

 

对于Java concurrent包里的并发,有这么一段话:

什么时候选择用 ReentrantLock 代替 synchronized

既然如此,我们什么时候才应该使用 ReentrantLock 呢?

答案非常简单 —— 在确实需要一些 synchronized 所没有的特性的时候,

比如时间锁等候、可中断锁等候、无块结构锁、多个条件变量或者锁投票。 

ReentrantLock 还具有可伸缩性的好处,应当在高度争用的情况下使用它,

但是请记住,大多数 synchronized 块几乎从来没有出现过争用,

所以可以把高度争用放在一边。我建议用 synchronized 开发,

直到确实证明 synchronized 不合适,而不要仅仅是假设如果使用 ReentrantLock “性能会更好”。

请记住,这些是供高级用户使用的高级工具。

一如既往,首先要把事情做好,然后再考虑是不是有必要做得更快。

 

ref:

http://blog.csdn.net/ghsau/article/details/7461369

http://blog.csdn.net/fw0124/article/details/6672522

分享到:
评论

相关推荐

    java多线程读取文件

    Java多线程读大文件 java多线程写文件:多线程往队列中写入数据

    多线程对文件读写操作(java)

    在Java编程中,多线程技术是提升程序执行效率的关键之一,特别是在进行文件读写操作时。本主题将深入探讨如何使用多线程来优化文件的读取和写入过程,以及需要注意的相关问题。 首先,我们需要理解单线程与多线程在...

    java 读写锁代码

    Java 读写锁是Java并发编程中的一种重要机制,它为多线程环境下的数据访问提供了更为精细的控制。在Java的`java.util.concurrent.locks`包中,`ReentrantReadWriteLock`类实现了读写锁的功能。这个锁允许多个读取者...

    java多线程经典案例

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

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

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

    java多线程进度条

    本主题将深入探讨如何在Java多线程环境下实现进度条功能。 首先,理解Java多线程的基本概念至关重要。Java通过Thread类和Runnable接口来支持多线程。创建一个新线程通常有两种方式:继承Thread类并重写run()方法,...

    java多线程Demo

    Java多线程是Java编程中的一个重要概念,它允许程序同时执行多个任务,提高了程序的效率和响应速度。在Java中,实现多线程有两种主要方式:继承Thread类和实现Runnable接口。 1. 继承Thread类: 当我们创建一个新...

    Java多线程编程之读写锁ReadWriteLock用法实例

    Java的多线程编程中,读写锁(ReadWriteLock)是一种高效的并发控制机制,它将锁的权限进行了区分,允许多个线程同时读取资源,但仅允许一个线程进行写入操作。这种设计模式提高了数据共享的效率,因为读操作通常...

    JAVAJAVA多线程教学演示系统论文

    《JAVA多线程教学演示系统》是一篇深入探讨JAVA多线程编程的论文,它针对教育领域中的教学需求,提供了一种生动、直观的演示方式,帮助学生更好地理解和掌握多线程技术。这篇论文的核心内容可能包括以下几个方面: ...

    Java多线程编程核心技术_完整版_java_

    Java多线程编程是Java开发中的重要组成部分,它允许程序同时执行多个任务,极大地提高了程序的效率和响应性。在Java中,多线程主要通过继承Thread类或实现Runnable接口来实现。本教程《Java多线程编程核心技术》将...

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

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

    多线程(22)读写锁分离模式1

    在多线程编程中,读写锁是一种优化并发访问共享资源效率的重要机制。读写锁分离模式允许多个读取操作并行执行,而写入操作则保持互斥,从而提高系统的整体性能。Java中提供了`java.util.concurrent.locks....

    java多线程编程

    Java多线程编程是Java开发中的重要组成部分,它允许程序同时执行多个任务,极大地提高了程序的效率和响应性。在Java中,多线程主要通过继承Thread类或实现Runnable接口来实现。本教程将深入探讨Java多线程的各个方面...

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

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

    举例说明Java多线程编程中读写锁的使用

    Java多线程编程中,读写锁是一种优化并发访问共享资源的有效工具,它允许多个线程同时读取,但只允许一个线程写入。Java的`java.util.concurrent.locks.ReentrantReadWriteLock`类提供了可重入的读写锁功能。下面...

    秒杀多线程第十六篇 多线程十大经典案例之一 双线程读写队列数据

    《秒杀多线程第十六篇 多线程十大经典案例之一 双线程读写队列数据》 http://blog.csdn.net/morewindows/article/details/8646902 配套程序 在《秒杀多线程系列》的前十五篇中介绍多线程的相关概念,多线程同步互斥...

    JAVA 多线程的PPT和示例

    Java多线程是Java编程中的一个核心概念,它允许程序同时执行多个独立的任务,从而提高应用程序的效率和响应性。在Java中,多线程主要通过两种方式实现:继承Thread类和实现Runnable接口。这份"JAVA多线程的PPT和示例...

    java多线程-读写锁原理

    在Java多线程编程中,读写锁是一种高级的同步机制,它允许多个线程同时读取共享资源,但只允许一个线程写入。这种锁的引入提高了并发性能,特别是在读操作远多于写操作的场景下。Java 5开始,`java.util.concurrent....

    深入学习:Java多线程编程

    《深入学习:Java多线程编程》是一本专注于Java并发技术的专业书籍,旨在帮助开发者深入理解和熟练运用Java中的多线程编程。Java多线程是Java编程中的核心部分,尤其在现代高性能应用和分布式系统中不可或缺。理解并...

    Java多线程程序设计

    Java多线程程序设计是Java开发中的重要领域,它允许应用程序同时执行多个任务,从而提高系统资源的利用率和程序的响应速度。在Java中,多线程主要通过两种方式实现:继承Thread类和实现Runnable接口。 一、创建线程...

Global site tag (gtag.js) - Google Analytics