一个读写锁面试题

问:一个Spring Bean类中有一个服务地址信息的成员变量,这个bean类中成员函数会根据服务地址调用其接口,同时这个服务地址信息可能会在运行时被用户修改,这种情况下是否存在线程安全问题?

答:如果用的Spring默认的单例Bean,因为涉及到多线程对成员变量的读写,会存在线程安全问题。

问:那有哪些方法解决这个问题?

答:用同步关键字,锁,ThreadLocal变量等,如果是读多写少的场景,可以用读写锁。

问:简单讲一下Java读写锁,你会怎么用?

答:读写锁同时拥有读锁和写锁,且读共享、写及读写互斥, 当读取数据时用读锁,当没有线程获取到写锁或获取写锁是当前线程时能获取到读锁,多个线程可同时获取到读锁;当写数据时用写锁,当没有线程获取到读锁时,可以获取到写锁,最多只有一个线程能获取到写锁,若当前线程获取到读锁必须要先释放才能获取到写锁。

问: 你知道Java读写锁实现原理吗?

答:基于AQS(抽象队列同步器,有一个voliate int state变量和互斥/共享获取、释放锁方法),Java 读写锁用state的高16位表示读锁的线程数,低16位表示写锁的重入数。其中读锁类中的Sync实现共享获取、释放锁方法,写锁类中Sync实现互斥获取、释放锁方法。

原文地址:https://www.cnblogs.com/doit8791/p/10970769.html

时间: 2024-11-12 00:45:23

一个读写锁面试题的相关文章

C基础 读写锁中级剖析

引言 读写锁 是为了 解决, 大量 ''读'' 和 少量 ''写'' 的业务而设计的. 读写锁有3个特征: 1.当读写锁是写加锁状态时,在这个锁被解锁之前,所有试图对这个锁加锁的线程都会被阻塞 2.当读写锁在读加锁状态时,再以读模式对它加锁的线程都能得到访问权,但以写模式加锁的线程将会被阻塞 3.当读写锁在读加锁状态时,如果有线程试图以写模式加锁,读写锁通常会阻塞随后的读模式加锁 我们先举一段标准库构建的读写锁demo来了解读写锁api 的使用 . pthread_rwlock.c #inclu

读写锁机制

在以前的一篇博文Linux多线程编程初探中,只提到了用于线程同步的互斥锁.条件变量,而没有提及读写锁(read-write lock). 本文主要整理自以下文章: 读写锁(read-write lock)机制-----多线程同步问题的解决 请用普通的互斥锁编程实现一个读写锁 读写锁 读写锁比mutex有更高的适用性,可以多个线程同时占用读模式的读写锁,但是只能一个线程占用写模式的读写锁. 1)当读写锁是写加锁状态时, 在这个锁被解锁之前, 所有试图对这个锁加锁的线程都会被阻塞. 2)当读写锁在读

一步一步实现读写锁

多线程编程中,需要对共享变量进行加锁.但是频繁地加锁,会对程序效率有很大影响.在某些读多写少的场景下,多个线程进行读数据时,如果都加互斥锁,这显然是不必须的.于是读写锁便应运而生. 读写锁的加锁规则: 1 如果没有加写锁时,那么多个线程可以同时加读锁:如果有加写锁时,不可以加读锁 2 不管是加了读锁还是写锁,都不能继续加写锁. 满足这两个条件,便可以初步实现一个读写锁.我们用两个锁,一个变量,实现一个简单的读写锁,代码如下 class rwlock { public: rwlock(): rea

读/写锁的实现和应用(高并发状态下的map实现)

程序中涉及到对一些共享资源的读和写操作,且写操作没有读操作那么频繁.在没有写操作的时候,两个线程同时读一个资源没有任何问题,所以应该允许多个线程能在同时读取共享资源.但是如果有一个线程想去写这些共享资源,就不应该再有其它线程对该资源进行读或写(译者注:也就是说:读-读能共存,读-写不能共存,写-写不能共存).这就需要一个读/写锁来解决这个问题. 按照上面的叙述,简单的实现出一个读/写锁 public class ReadWriteLock{ private int readers = 0; pr

Windows线程同步【4】读写锁(RWMutex)

在视频播放机程序中,经常采用这样的架构: 一个负责读文件的线程,负责从媒体文件中读取数据并将数据包放入一个包队列(queue),另外有多个线程从这个包队列中取包并解码,然后交给负责显示的线程以便显示图像.于是,便形成了多个线程共享一个队列,一个写,多个只读不写的情形. 在很多时候,我们都会遇到一个写线程(负责写数据),多个读线程(负责读数据)的情形.在这类情形下,当然可以用锁来保证每个线程对共享数据的访问是独占的.但这样的做法在此情形下是低效的,因为它会使得一个读线程在读数据时另外的读线程只能干

ReentrantReadWriteLock读写锁的使用

Lock比传统线程模型中的synchronized方式更加面向对象,与生活中的锁类似,锁本身也应该是一个对象.两个线程执行的代码片段要实现同步互斥的效果,它们必须用同一个Lock对象. 读写锁:分为读锁和写锁,多个读锁不互斥,读锁与写锁互斥,这是由jvm自己控制的,你只要上好相应的锁即可.如果你的代码只读数据,可以很多 人同时读,但不能同时写,那就上读锁:如果你的代码修改数据,只能有一个人在写,且不能同时读取,那就上写锁.总之,读的时候上读锁,写的时候上写锁! ReentrantReadWrit

Linux环境编程之同步(三):读写锁

概述 互斥锁把试图进入我们称之为临界区的所有其他线程都阻塞住.该临界区通常涉及对由这些线程共享一个或多个数据的访问或更新.读写锁在获取读写锁用于读某个数据和获取读写锁用于写直接作区别.读写锁的分配规则如下: 1.只要没有线程持有某个给定的读写锁用于写,那么任意数目的线程可以持有该读写锁用于读. 2.仅当没有线程持有某个给定的读写锁用于读或用于写时,才能分配该读写锁用于写. 即只要没有线程在修改某个给定的数据,那么任意数目的线程都可以拥有该数据的读访问权.仅当没有其他线程在读或修改某个给定的数据时

java中ReentrantReadWriteLock读写锁的使用

ReentrantReadWriteLock读写锁的使用 Lock比传统线程模型中的synchronized方式更加面向对象,与生活中的锁类似,锁本身也应该是一个对象.两个线程执行的代码片段要实现同步互斥的效果,它们必须用同一个Lock对象. 读写锁:分为读锁和写锁,多个读锁不互斥,读锁与写锁互斥,这是由jvm自己控制的,你只要上好相应的锁即可.如果你的代码只读数据,可以很多人同时读,但不能同时写,那就上读锁:如果你的代码修改数据,只能有一个人在写,且不能同时读取,那就上写锁.总之,读的时候上读

Linux程序设计学习笔记----多线程编程线程同步机制之互斥量(锁)与读写锁

互斥锁通信机制 基本原理 互斥锁以排他方式防止共享数据被并发访问,互斥锁是一个二元变量,状态为开(0)和关(1),将某个共享资源与某个互斥锁逻辑上绑定之后,对该资源的访问操作如下: (1)在访问该资源之前需要首先申请互斥锁,如果锁处于开状态,则申请得到锁并立即上锁(关),防止其他进程访问资源,如果锁处于关,则默认阻塞等待. (2)只有锁定该互斥锁的进程才能释放该互斥锁. 互斥量类型声明为pthread_mutex_t数据类型,在<bits/pthreadtypes.h>中有具体的定义. 互斥量