读-写锁 ReadWriteLock & 线程八锁
读-写锁 ReadWriteLock:
①ReadWriteLock 维护了一对相关的锁,一个用于只读操作, 另一个用于写入操作。
只要没有 writer,读取锁可以由 多个 reader 线程同时保持。写入锁是独占的。。
②ReadWriteLock 读取操作通常不会改变共享资源,但执行 写入操作时,必须独占方式来获取锁。
对于读取操作占多数的数据结构。 ReadWriteLock 能提供比独占锁更高 的并发性。
而对于只读的数据结构,其中包含的不变性可以完全不需要考虑加锁操作
TestReadWriteLock
package com.aff.juc; import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock; public class TestReadWriteLock {
public static void main(String[] args) {
ReadWriteLockDemo rw = new ReadWriteLockDemo();
new Thread(new Runnable() {
@Override
public void run() {
rw.set((int) Math.random() * 101);// [0-100]随机整数, 100+1 为[1-00]
}
}, "一个线程写:").start(); for (int i = 0; i <= 100; i++) {
new Thread(new Runnable() {
@Override
public void run() {
rw.get();
}
}).start();
}
}
} class ReadWriteLockDemo { private int number = 0;
private ReadWriteLock lock = new ReentrantReadWriteLock(); // 读取
public void get() {
lock.readLock().lock();// 上锁
try {
System.out.println(Thread.currentThread().getName() + " : " + number);
} finally {
lock.readLock().unlock();// 释放锁
}
} // 写
public void set(int number) { lock.writeLock().lock();// 上锁
try {
System.out.println(Thread.currentThread().getName());
this.number = number;
} finally {
lock.writeLock().unlock();// 释放锁
}
}
}
线程八锁:
① 一个对象里面如果有多个synchronized方法,某一个时刻内,
只要一个线程去调用 其中的一个synchronized方法了,
其它的线程都只能等待,换句话说,某一个时刻 内,只能有唯一一个线程去访问这些synchronized方法
② 锁的是当前对象this,被锁定后,其它的线程都不能进入到当前对象的其它的 synchronized方法
③ 加个普通方法后发现和同步锁无关
④ 换成两个对象后,不是同一把锁了,情况立刻变化。
⑤ 都换成静态同步方法后,情况又变化
⑥ 所有的非静态同步方法用的都是同一把锁——实例对象本身,
也就是说如果一个实 例对象的非静态同步方法获取锁后,
该实 例对象的其他非静态同步方法必须等待获 取锁的方法释放锁后才能获取锁,
可是别的实例对象的非静态同步方法因为跟该实 例对象的非静态同步方法用的是不同的锁,
所以毋须等待该实例对象已获取锁的非 静态同步方法释放锁就可以获取他们自己的锁。
⑦ 所有的静态同步方法用的也是同一把锁——类对象本身,这两把锁是两个不同的对 象,
所以静态同步方法与非静态同步方法之间是不会有竞态条件的。但是一旦一个 静态同步方法获取锁后,
其他静态同步方法都必须等待该方法释放锁后才能获取锁,而不管是同一个实例对象的静态同步方法
之间还是不同的实例对象的静态同 步方法之间,只要它们同一个类的实例对象!
关键点:①非静态方法的默认锁为 this,静态方法的默认锁为对应的 Class 实例
②某一时刻内,只能有一个线程持有锁,无论几个方法。
读-写锁 ReadWriteLock & 线程八锁的更多相关文章
- (三)juc高级特性——虚假唤醒 / Condition / 按序交替 / ReadWriteLock / 线程八锁
8. 生产者消费者案例-虚假唤醒 参考下面生产者消费者案例: /* * 生产者和消费者案例 */ public class TestProductorAndConsumer { public stat ...
- 线程中的读写锁ReadWriteLock
Lock锁还有两个非常强大的类 ReadWriteLock接口实现类ReentrantReadWriteLock(非常重要的锁) 想实现 读取的时候允许多线程并发访问,写入的时候不允许. 这种效果.. ...
- 显式锁(三)读写锁ReadWriteLock
前言: 上一篇文章,已经很详细地介绍了 显式锁Lock 以及 其常用的实现方式- - ReetrantLock(重入锁),本文将介绍另一种显式锁 - - 读写锁ReadWriteLock. ...
- 【漫画】互斥锁ReentrantLock不好用?试试读写锁ReadWriteLock
ReentrantLock完美实现了互斥,完美解决了并发问题.但是却意外发现它对于读多写少的场景效率实在不行.此时ReentrantReadWriteLock来救场了!一种适用于读多写少场景的锁,可以 ...
- C# 多线程编程之锁的使用【互斥锁(lock)和读写锁(ReadWriteLock)】
多线程编程之锁的使用[互斥锁(lock)和读写锁(ReadWriteLock)] http://blog.csdn.net/sqqyq/article/details/18651335 多线程程序写日 ...
- 【漫画】读写锁ReadWriteLock还是不够快?再试试StampedLock!
本文来源于公众号[胖滚猪学编程] 转载请注明出处! 在互斥锁ReentrantLock不好用?试试读写锁ReadWriteLock一文中,我们对比了互斥锁ReentrantLock和读写锁ReadWr ...
- Java 读写锁 ReadWriteLock 原理与应用场景详解
Java并发编程提供了读写锁,主要用于读多写少的场景,今天我就重点来讲解读写锁的底层实现原理@mikechen 什么是读写锁? 读写锁并不是JAVA所特有的读写锁(Readers-Writer Loc ...
- 线程同步——用户模式下线程同步——Slim读写锁实现线程同步
//Slim读/写锁实现线程同步 SRWlock 的目的和关键段相同:对同一资源进行保护,不让其它线程访问. 但是,与关键段不同的是,SRWlock允许我们区分哪些想要读取资源的线程(读取者线程) 和 ...
- Linux:使用读写锁使线程同步
基础与控制原语 读写锁 与互斥量类似,但读写锁允许更高的并行性.其特性为:写独占,读共享. 读写锁状态: 一把读写锁具备三种状态: 1. 读模式下加锁状态 (读锁) 2. 写模式下加锁 ...
随机推荐
- http抓包—Content-Type讲解
1.Content-Type的定义 Content-Type(MediaType),即是Internet Media Type,互联网媒体类型,也叫做MIME类型.在互联网中有成百上千中不同的数据类型 ...
- E. Kamil and Making a Stream 区间gcd
E. Kamil and Making a Stream 这个题目要用到一个结论,就是区间一个区间长度为n的不同的gcd不会超过logn 个, 其实就是知道这个题目可以暴力就好了. 然后就是对于每一个 ...
- java基础篇 之 集合概述(List)
list,有序集合,元素可重复 LinkedList:底层用链表实现,查找慢,增删快.为什么?? ArrayList:底层用数组实现,查找看,增删慢.为什么?? Vector:跟ArrayList一样 ...
- QTableWidget自定义委托
QTableWidget单元格使用自定义的lineEdit控件导致不能选中 使用自定义委托解决 1.自定义委托 class LineEditDelegate : public QItemDelegat ...
- Ubuntu 1804 安装xmind8详细过程
安装比较简单, 折腾了很久,一启动就报错,切换了JDK版本就能用了: 安装 登陆官网,下载xmind8: 下载得到文件xmind-8-update9-linux.zip: 将文件解压至路径xmind下 ...
- JDBC11 封装+资源配置文件管理
封装为Utils类+程序资源文件去配置 public class Utils { static Properties p=null; static { p=new Properties(); try ...
- c#实现生成PDF的底层方法
在用uwp生成pdf的时候,发展此类类库有限,有的也需要钱,我最后实现pdf的底层方法生成pdf,代码如下 private async void GeneratePdf() { var file = ...
- Ubuntu+uWSGI部署Django项目【鸿篇巨制,事无巨细】
背景 任务: 视频翻译项目需要在两个服务器上进行通信(国内&海外的阿里服务器). 因为python是主语言,选用了Django 来快速部署API. 注:Django中文文档:https://d ...
- 学习docker的一点记录
0x00 docker简介 Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows 机器上,也可以实现虚拟化 ...
- ⚠ | 不要再使用 markdown 主题了!
前置 我在很久之前就发现了使用第三方 markdown 主题将产生一个的问题,今日在社区发现依然有人写文章来推荐这种做法.接下来我告诉你为什么最好不要这样做以及分享一些 markdown 技巧.若有不 ...