多线程之读写锁

news/2024/6/29 12:16:03 标签: 多线程,

之前没真正使用读写,看到别人对读写的解释总感觉一头雾水。今天亲自敲代码实验之后,才明了,原来如此。网上没有一篇文章是能描述出自己理解的样子,所以将自己的思路记下来。先提出疑问,边自答边找思路,有了思路,再回头去运行一下代码,就清晰明了了。
如果你急着想要一句话概括读写,那我会告诉你:
是加在读方法里的,是为了方便线程在运行写方法的时候阻止其他线程执行这个读方法,而没有写操作时读被忽略。
额,不知道我这么说会不会有人能理解,哈哈哈,如果不理解,可以看章末读写的执行图。

1.首先先提出疑问

  • 为什么要区分读写?如果只有一种会是怎样?
    自答:只有一种,那无论什么方法只要加了,就只能有一个线程可以进入。
  • 但如果出现接下来说明的情况,简单效率就十分低,情况是这样的:
    有个对象,可以对一个共有资源进行读写操作。读写都需要加吧?
    自答:若不加那么写的时候读的结果就被影响了。嗯,所以加
  • 当多个线程使用这个对象进行读操作,会是怎样?
    每次进入读的代码时,都要等待获得。那这种等待是没有必要的。为了解决读操作的等待,特地区分了

2.认识区分策略

:当线程获得写时,其他所有准备进入加的线程(不管写还是读)都进入阻塞状态。
:当线程获取读时,如果有线程在写,则进入阻塞状态,没有则可以进入执行。

3.边运行边感受

读写的执行图如下:
在这里插入图片描述
附上读写类的代码:

   public class ReadWriteTest {
    private ReentrantReadWriteLock lock = new ReentrantReadWriteLock();

    public void read(){
        try{
            try{
                lock.readLock().lock();
                System.out.println("获得读" + Thread.currentThread().getName()
                + " " + System.currentTimeMillis());
                Thread.sleep(1000 * 2);
                System.out.println("结束读");
            }finally {
                lock.readLock().unlock();
            }
        }catch (InterruptedException e){
            e.printStackTrace();
        }
    }

   public void write(){
        try{
            try{
                lock.writeLock().lock();
                System.out.println("获得写" + Thread.currentThread().getName()
                + " " + System.currentTimeMillis());
                Thread.sleep(1000 * 2);
                System.out.println("结束写");
            }finally {
                lock.writeLock().unlock();
            }
        }catch (InterruptedException e){
            e.printStackTrace();
        }
    }

}

http://www.niftyadmin.cn/n/1787533.html

相关文章

Redis哨兵部署(Windows)

本文介绍Redis在windows上的高可用配置——哨兵部署。 一、先简单介绍一下哨兵高可用原理 (了解的可以直接跳过) 1 主从redis服务器。为了预防主实例master挂掉,额外增加两个slave实例,时刻与master信息同步以备用。 2 哨兵智能…

django在windows上的安装

在官网上就有完整的教程——django官网如何在windows安装。直接按照官网上的操作,注意与python版本对应,否则会出现各种错误。 windows适用版本:window 7,8,10 本文描述的是window 7环境.接下来直接上步奏: 1.python安装 python…

多线程状态-复习

1.创建 创建有两种方式:1继承Thread,2实现Runnable。其实继承Thread,也会实现Runbable。 new Thread去建立一个线程,线程的资源是new Thread中传入的对象。 2.状态 线程的状态有NEW , RUNNABLE , WAITING , TING_WAITING ,BLOCKED, TERMINATE…

多线程同步异步-复习

一、线程执行概览 一个Thread,被new一次就创建了一个新线程。 每个线程的共有资源是此线程对象持有的对象,如下图的thread-a/thread-b/thread-c调用single对象的方法,即持有single对象资源,这是共有的。 每个线程有自己的方法栈&…

多线程协作-复习

多线程的协作,只会出现在同步过程中。 实现协作的关键字有wait/notify对,join. 1.wait/notify 线程靠对象监视器来同步协作,所以是这样实现的: 监视对象obj作为锁,有wait和notify的监视方法。线程使用obj.wait() / …

Spring Cloud笔记-Eureka

1.Eureka解决的问题: 实现服务高可用 2.Eureka实现原理: (1)服务注册发现 服务实例向注册中心注册(推送元数据),并主动定时发送心跳(lease-renuwal-interval-in-seconds30&#xff0…

网站的高可用

看了《大型网站技术架构》这本书之后,吸取了其中的精华,对网站的高可用议题进行了一遍梳理。如下将从高可用的思路,衡量标准,实施方案来做总结。 对高可用的理解 一个系统能保证不论有多少并发量,都能够正常提供服务…

《远见》职场燃料

职场中值得去学习的技能和值得不断累积的经验,可以使我们适用于不同的公司,面对职场中常有的问题,能轻车驾熟。如下是三大职场燃料的总结脑图。以此共勉。