读锁跟写锁的区别

读锁:读读不互斥

写锁:独占

lock下有读写锁 ReadWriteLock

synchronized 是独占的

1.Java并发库中ReetrantReadWriteLock实现了ReadWriteLock接口并添加了可重入的特性

2.ReetrantReadWriteLock读写锁的效率明显高于synchronized关键字

3.ReetrantReadWriteLock读写锁的实现中,读锁使用共享模式;写锁使用独占模式,换句话说,读锁可以在没有写锁的时候被多个线程同时持有,写锁是独占的

4.ReetrantReadWriteLock读写锁的实现中,需要注意的,当有读锁时,写锁就不能获得;而当有写锁时,除了获得写锁的这个线程可以获得读锁外,其他线程不能获得读锁

原文地址:https://www.cnblogs.com/wengshuhang/p/9866459.html

时间: 2024-10-13 15:02:38

读锁跟写锁的区别的相关文章

读锁和写锁的区别联系

共享锁(S锁)又称读锁,若事务T对数据对象A加上S锁,则事务T可以读A但不能修改A,其他事务只能再对A加S锁,而不能加X锁,直到T释放A上的S 锁.这保证了其他事务可以读A,但在T释放A上的S锁之前不能对A做任何修改.排他锁(X锁)又称写锁.若事务T对数据对象A加上X锁,事务T可以读A也可以修改A,其他事务不能再对A加任何锁,直到T释放A上的锁.这保证了其他事务在T释放A上的锁之前不能再读取和修改A.

数据库的读锁和写锁在业务上的应用场景总结

一.背景 熟悉MySQL数据库的朋友们都知道,查询数据常见模式有三种: 1. select ... :快照读,不加锁 2. select ... in share mode:当前读,加读锁 3. select ... for update:当前读,加写锁 从技术层面理解三种方式的应用场景其实并不困难,下面我们先快速复习一下这三种读取模式的在技术层面上的区别. 注:为了简化问题的描述,下面所有结论均是针对MySQL数据库InnoDB储存引擎RR隔离级别下的. 1.1 select ... 读取当前

“全栈2019”Java多线程第四十一章:读锁与写锁之间相互嵌套例子

难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多线程第四十一章:读锁与写锁之间相互嵌套例子 下一章 "全栈2019"Java多线程第四十二章:获取线程与读写锁的保持数 学习小组 加入同步学习小组,共同交流与进步. 方式一:关注头条号Gorhaf,私信"Java学习小组". 方式二:关注公众号Gorhaf,回复&quo

MySQL之DDL、DML、读锁,写锁、显示锁、事务、隔离级别详解

mysql> help insert; DDL: DATABASE TABLE VIEW DML: SELECT INSERT/REPLACE UPDATE DELETE INSERT INTO: 第一种: INSERT INTO tb_name [(col1, col2,...)] {VALUES|VALUE} (val1, val2,...)[,(val21,val22,...),...] 第二种: INSERT INTO tb_name SET col1=val1, col2=val2,

mysql 读锁和写锁

读锁:所有的会话只能进行SELECT语句查询 LOCK TABLE [TABLE_NAME] READ SELECT * FROM TABLE_NAME; INSERT INTO TABLE_NAME () VALUES (); #一直等待,直到解锁或者超时 写锁:只有当前会话能增删改查,其他会话无法任何操作 LOCK TABLE [TABLE_NAME] WRITE 解锁: UNLOCK TABLES #常规解锁 LOCO TABLE [TABLE_NAME] READ #再一次锁上,会解除上

读锁和写锁

共享锁(S锁)又称读锁,若事务T对数据对象A加上S锁,则事务T可以读A但不能修改A,其他事务只能再对A加S锁,而不能加X锁,直到T释放A上的S 锁.这保证了其他事务可以读A,但在T释放A上的S锁之前不能对A做任何修改. 排他锁(X锁)又称写锁.若事务T对数据对象A加上X锁,事务T可以读A也可以修改A,其他事务不能再对A加任何锁,直到T释放A上的锁.这保证了其他事务在T释放A上的锁之前不能再读取和修改A.

QReadWriteLock 读写锁的区别

QReadWriteLock 这个允许多个进程同时读,但是只有一个写.而且写读不能同时进行. 文档里语焉不详,这是我自己的理解: lockForWrite 为写而锁,就是要修改数据,外人连想进来读数据都不行,完全霸占数据使用权. lockForRead 为读而锁,就是在读取数据期间不要被修改,但是别人也要求来读数据的话,则不拒绝.但是别人来改数据,那就等我读完数据以后再说. QReadWriteLock lock; void write() { lock.lockForWrite();//为写而

信号量、互斥锁,读写锁和条件变量的区别

信号量强调的是线程(或进程)间的同步:“信号量用在多线程多任务同步的,一个线程完成了某一个动作就通过信号量告诉别的线程,别的线程再进行某些动作(大家都 在sem_wait的时候,就阻塞在那里).当信号量为单值信号量是,也可以完成一个资源的互斥访问.有名信号量:可以用于不同进程间或多线程间的互斥与同步 创建打开有名信号量 sem_t *sem_open(const char *name, int oflag); sem_t *sem_open(const char *name, int oflag

Mysql:行锁 表锁 乐观锁 悲观锁 读锁 写锁

锁是在执行多线程时用于强行限制资源访问的同步机制,即用于在并发控制中保证对互斥要求的满足.在DBMS中,可以按照锁的粒度把数据库锁分为行级锁(INNODB引擎).表级锁(MYISAM引擎)和页级锁(BDB引擎 ). 行锁 锁定整个行数据,开销大,加锁慢,会出现死锁.锁定粒度小,发生锁冲突的概率低,并发度高. 表锁 锁定整个表数据,开销小,加锁快,不会出现死锁.锁定粒度大,发生锁冲突概率高,并发度低. 悲观锁 每次取数据时都认为别人会修改,所以每次取数据的时候都会上锁,这样别人想拿这个数据就会被阻