ReentrantReadWriteLock——写写互斥(二)

"读写" 、"写读"、"写写"都是同步的、互斥的

1、Service.java

package ReentrantReadWriteLock;

import java.util.concurrent.locks.ReentrantReadWriteLock;

public class Service {

    private ReentrantReadWriteLock lock = new ReentrantReadWriteLock();

    //写写互斥
    public void write(){

        try{
            try{
                lock.writeLock().lock();//写锁
                System.out.println("获得写锁"+Thread.currentThread().getName()+" "+System.currentTimeMillis());
                Thread.sleep(10000);
            }finally{
                lock.writeLock().unlock();//解锁
            }

        }catch(Exception e){
            e.printStackTrace();
        }

    }

}

可以发现,lock.writeLock()的效果就是同一时间只允许一个线程执行lock()方法后面的代码

2、ThreadA.java

package ReentrantReadWriteLock;

public class ThreadA extends Thread{

    private Service service ;

    public ThreadA(Service service){
        super();
        this.service = service;
    }

    @Override
    public void run(){
        service.write();
    }

}

3、ThreadB.java

package ReentrantReadWriteLock;

public class ThreadB extends Thread{

private Service service ;

    public ThreadB(Service service){
        super();
        this.service = service;
    }

    @Override
    public void run(){
        service.write();
    }

}

4、Run.java

package ReentrantReadWriteLock;

public class Run {

    public static void main(String[] args) {

        Service service = new Service();
        ThreadA a = new ThreadA(service);
        a.setName("A");
        ThreadB b = new ThreadB(service);
        b.setName("B");
        a.start();
        b.start();
    }
}

可以自己更改ThreadA和ThreadB类中的run()方法里的read()、write()方法,实验"读写"、"写读"、"写写"

时间: 2024-08-24 03:05:23

ReentrantReadWriteLock——写写互斥(二)的相关文章

synchronized与lock 对象锁、互斥锁、共享锁以及公平锁和非公平锁

synchronized与lock  都是用来实现线程同步的锁,synchronized对象锁,lock是一个接口,她的实现有reentrantlock互斥锁以及ReentrantReadWriteLock共享锁. 这里说明一下ReentrantReadWriteLock共享锁,所谓共享就是该锁提供读读锁共享,即可以多个线程共享一个读取锁,但是读写锁以及读读锁是互斥的. 看到网上有好多介绍介绍锁的种类的,有对象锁.互斥锁.共享锁以及公平锁和非公平锁,但是说明都不够详细了然,在这里用直白的说法记录

多线程之美7一ReentrantReadWriteLock源码分析

目录 前言 在多线程环境下,为了保证线程安全, 我们通常会对共享资源加锁操作,我们常用Synchronized关键字或者ReentrantLock 来实现,这两者加锁方式都是排他锁,即同一时刻最多允许一个线程操作,然而大多数场景中对共享资源读多于写,那么存在线程安全问题的是写操作(修改,添加,删除),我们是否应该考虑将读和写两个分开,只要运用合理,并发性能是不是可以提高,吞吐量增大呢? ReentrantReadWriteLock已经为我们实现了这种机制,我们一起来看它是怎样实现的吧! 1.读写

ReentrantReadWriteLock源码分析

概述 ReentrantReadWriteLock维护了一对相关的锁,它们分别是共享readLock和独占writeLock.关于共享读锁和排他写锁的概念其实很好理解.所谓共享读锁就是一个线程读的时候,其它线程也可以来读(共享),但是不能来写.排他写锁是指一个线程在写的时候,其它线程不能来写或读(排他).除了这个特点之外,ReentrantReadWriteLock还有一个特点就是可重入的.它和ReentrantLock一样都是支持Condition的.而且ReentrantReadWerite

Xcode学习C++(二、指针和引用)

一:指针部分 指针是一种变量类型,声明指针变量需要分配独立的存储空间,指针可以为空『void』表示不指向任何对象. 指针里存储的值是一个地址,可以通过这个地址获取和改变所存储变量的值. 指针的类型必须与其所指向变量的类型一致,可以在任何时候改变指向的变量…… ————————————————————这些是简单理论的啰嗦,下面说些代码相关的———————————————————————————— 定义方式:int *p = &a;  *是指针的标识符,表示p是一个指针类型的变量,这里的变量a,必须

比较synchronized和读写锁

一.科普定义 这篇博文的两个主角“synchronized”和“读写锁” 1)synchronized 这个同步关键字相信大家都用得比较多,在上一篇“多个线程之间共享数据的方式”中也详细列举他的应用,在这就不多说只做几点归纳: Java提供这个关键字,为防止资源冲突提供的内置支持.当任务执行到被synchronized保护的代码片段的时候,它检查锁是否可用,然后获取锁,执行代码,释放锁. 常用这个关键字可以修饰成员方法和代码块 2)读写锁 我们对数据的操作无非两种:“读”和“写”,试想一个这样的

多线程编程学习四(Lock 的使用).

一.前言 本文要介绍使用Java5中 Lock 对象,同样也能实现同步的效果,而且在使用上更加方便.灵活,主要包括 ReentrantLock 类的使用和ReentrantReadWriteLock 类的使用. 二.使用ReentrantLock 类 1.在java多线程中,可以使用synchronized关键字来实现线程之间同步互斥,但在JDK1.5中新增加的ReentrantLock也能达到同样的效果,并且在扩展功能上也更加强大,比如具有嗅探锁定.多路分支通知等功能,而且在使用上也比sync

java架构《并发线程高级篇四》

本章主要讲并发线程的常见的两种锁.重入锁和读写锁 一:重入锁(ReentrantLock) 概念:重入锁,在需要进行同步的代码加锁,但最后一定不要忘记释放锁,否则会造成锁永远不能释放,其他线程进不了 代码解析: 实例化:Lock lock = new ReentrantLock(); 锁定:lock .lock(); 释放锁:lock.unlock(); 代码: private Lock lock = new ReentrantLock(); public void method1(){ try

十五、读写锁

一.简介 有时候我们对资源的修改操作非常地少,但是读取的频率却很高.如果采用一般的互斥锁,那么大量的读取操作也需要做等待.基于读写分离的思想,我们可以使用JDK的读写锁来处理这种情况. 1)读读不互斥: 2)读写互斥. 3)写写互斥 JDK文档地址:http://tool.oschina.net/uploads/apidocs/jdk-zh/java/util/concurrent/locks/ReentrantReadWriteLock.html 二.代码示例 import java.util

Java研发工程师知识点总结

Java研发工程师知识点总结 最近一次更新2017年12月08日 大纲 一.Java基础(语言.集合框架.OOP.设计模式等) 二.Java高级(JavaEE.框架.服务器.工具等) 三.多线程和并发 四.Java虚拟机 五.数据库(Sql.MySQL.Redis等) 六.算法与数据结构 七.计算机网络 八.操作系统(OS基础.Linux等) 九.其他 一.Java基础(语言.集合框架.OOP.设计模式等) 1. HashMap和Hashtable的区别 Hashtable是基于陈旧的Dicti