首页
学习
活动
专区
圈层
工具
发布
    • 综合排序
    • 最热优先
    • 最新优先
    时间不限
  • 来自专栏Devops专栏

    11.线程八

    11.线程八 线程八 • 一个对象里面如果有多个synchronized方法,某一个时刻内,只要一个线程去调用其中的一个synchronized方法了,其它的线程都只能等待,换句话说,某一个时刻内, • 都换成静态同步方法后,情况又变化 • 所有的非静态同步方法用的都是同一把——实例对象本身,也就是说如果一个实例对象的非静态同步方法获取后,该实例对象的其他非静态同步方法必须等待获取的方法释放后才能获取 ,可是别的实例对象的非静态同步方法因为跟该实例对象的非静态同步方法用的是不同的,所以毋须等待该实例对象已获取的非静态同步方法释放就可以获取他们自己的。 但是一旦一个静态同步方法获取后,其他的静态同步方法都必须等待该方法释放后才能获取,而不管是同一个实例对象的静态同步方法之间,还是不同的实例对象的静态同步方法之间,只要它们同一个类的实例对象! : * ①非静态方法的默认为 this, 静态方法的为 对应的 Class 实例 * ②某一个时刻内,只能有一个线程持有,无论几个方法。

    37420编辑于 2022-03-23
  • 来自专栏分享技术

    C++11中的互斥讲解

    为此我使用了一个 mutex 和一个(lock)。 mutex 是同步操作的主体,在 C++ 11 的 <mutex> 头文件中,有四种风格的实现:mutex:提供了核心的 lock() unlock() 方法,以及当 mutex 不可用时就会返回的非阻塞方法 手动加锁和解锁可能造成问题,比如忘记解锁或的次序出错,都会造成死锁。C++ 11 标准提供了若干类和函数来解决这个问题。 unique_lock:通用 mutex 封装类,与 lock_guard 不同,还支持延迟、计时、递归、移交的持有权,以及使用条件变量。不允许拷贝,但允许转移(move)。 小心使用递归:std::recursive_mutex允许同一个线程多次获得,并在最后一次解除锁定。但是,在实际应用中,这种机制可能会导致死锁问题和性能瓶颈等问题,因此必须谨慎地使用。

    68510编辑于 2023-11-26
  • 来自专栏科控自动化

    Win11关闭自动屏功能

    第五步:分别在下拉菜单中选择“从不”,将两个选项都改成“从不”即可关闭自动屏。   完成这些步骤后,您的Win11系统将不再在您离开时自动屏。

    3.4K10编辑于 2024-06-17
  • 来自专栏10km的专栏

    编程:c++11基于atomic实现共享读写(写优先)

    关于CAS的概念参见下面的文章: 无编程以及CAS 在c++11中CAS指令已经被封装成了 非常方便使用的atomic模板类, 详情参见: atomic参考 以下代码利用atomic实现了一个读写资源 cstdlib> #include <cassert> #include <atomic> #include <thread> #include "raii.h" /* * atomic实现读写资源, ::thread::id RWLock::NULL_THEAD; 说明1 atomic_int,atomic_uint都是从atomic类模板中派生出来的类,对应不同的数据类型 atomic是c++11 标准,在gcc编译的时候必须加入std=c++11选项才能正确编译,,vs编译至少要用vs2012,因为visual studio 2012以上才支持atomic模板 说明2 如果按照默认的类定义方法 说明4 read_guard,write_guard函数返回的raii类参见我的另一篇博客《C++11实现模板化(通用化)RAII机制》

    2.2K20编辑于 2022-05-07
  • 来自专栏嵌入式技术笔记

    C++11 std::lock_guard 互斥

    C++11中加入了线程,引入了多线程,也就伴随着一个多线程资源互斥的操作。对于的使用,有一个比较头疼的问题,就是在加锁后,容易忘记解锁,这样程序中可能会造成死锁。 C++11中加入了lock_guard,这个的使用,可以让你不用关注解锁! 这个是利用了C++的特性(析构函数),用法是在函数开始的地方声明一个lock_guard 对象,构造函数中启用加锁,函数结束的时候,这个lock_guard 对象作用域也就结束了,自动析构,析构时会自动释放! lock_guard*/ #include <iostram> std::mutex mutex; int counter = 0; void testFunc() { //lock_guard 互斥

    1.9K20发布于 2021-05-31
  • 来自专栏分布式锁通关指南

    【📕分布式通关指南 11】源码剖析redisson之读写的实现

    读写的实现思路和 JDK 自带的 java.util.concurrent.locks.ReadWriteLock 类似,Redisson 的读写同样提供两种:读(RLock 类型)写(RLock 每获取一次读,会在 Redis 维护一个计数,用于标识该读被多少线程持有。获取写时,需要判断 Redis 中是否已有读或写被占用,若被占用则需要阻塞或返回获取失败。 // ...}释放无论是读还是写,都会在 unlock() 时进行一个 Lua 脚本调用,对计数器进行 -1。 如果读计数降到 0,说明没人再持有读,可以清除对应的 key 同时释放资源;写同理——当计数回到 0 时,说明可以彻底释放。如何保证分布式读写的一致性? 小结RedissonReadWriteLock 在分布式环境下完美复刻了本地读写的行为:读可并行、写需互斥、读写也互斥。

    28510编辑于 2025-07-01
  • 来自专栏Zaqdt_ACM

    C++11单例设计模式(双检查

    );        还有一种是懒汉模式,顾名思义,当你需要用它的时候才去实例化对象,如果多个线程同时去实例化对象,那么产生的对象可能不唯一,所以存在线程安全的问题,避免这个线程安全的解决办法是用双检查(

    1.4K10发布于 2020-02-15
  • 来自专栏程序员小航

    Redisson 分布式源码 11:Semaphore 和 CountDownLatch

    前言 Redisson 除了提供了分布式之外,还额外提供了同步组件,Semaphore 和 CountDownLatch。

    51940发布于 2021-07-09
  • 来自专栏RTSP/RTMP直播相关

    如何使用C++11原子操作实现自旋

    ​什么是自旋?C++自旋是一种低层次的同步原语,用于保护共享资源的访问。自旋是一种轻量级的,适用于短时间的资源锁定。 图片自旋的特点:当一个线程尝试获取已经被另一个线程占有的自旋时,这个线程会进入一个循环(自旋),在这个循环中它不断地检查是否已经被释放。如果已经被释放,那么该线程就可以获取到并执行。 如果仍然被占用,该线程就会一直处于自旋状态,直到获取到。自旋的一个重要特点是它不会导致调用者睡眠,如果自旋已经被占用,调用者会一直处于忙等待状态,直到能够获取到。 C++11没有提供专门用于实现自旋的接口,但可以通过使用原子操作和条件变量来实现自旋。 使用C++11原子操作实现自旋C++11没有提供专门用于实现自旋的接口,但可以通过使用原子操作(atomic operations)和条件变量(condition variables)来实现自旋

    1.2K00编辑于 2023-09-02
  • 来自专栏慕枫技术笔记

    11 张图深入理解分布式原理

    ,还包含了删除信息的释放的过程,但是如果库存服务 1 在加锁之后挂掉了,无法进行的释放,而其他服务又无法获取到就会造成死锁的问题。 当然了我们可以通过一个定时任务去检查表中是不是有过时的资源。但是这样无疑增加了分布式实现的复杂性。 那么问题的本质是如何让可以释放,因此我们需要在设置的时候加上过期时间,这样即使库存服务 1 挂了,无法主动释放,那么到了过期时间后失效,库存服务 2 依然可以获取,不会再造成死锁问题。 上文提到的获取判断是不是自己方服务实例加的,再执行删除的过程实际并不是原子的。 如对于 Redis 的设置的步骤以及删除的步骤都进行了封装。在设置的操作中,还引入了自动给续期的机制,SDK 检测到业务未完成,但是要到期后,执行定续期。

    76520编辑于 2023-03-20
  • 来自专栏悟空聊架构 | 公众号

    无法获得 varlibdpkglock - open (11: 资源临时不可用)

    一、无法获得 /var/lib/dpkg/lock – open (11: 资源暂时不可用) 在用sudo apt-get install 安装软件时,由于速度太慢,想换个软件源,直接关闭了终端,apt-get 但进程没有结束,结果终端提示 “E: 无法获得 /var/lib/dpkg/lock – open (11: 资源暂时不可用) E: 无法锁定管理目录(/var/lib/dpkg/),是否有其他进程正占用它

    2.7K150发布于 2018-05-18
  • 来自专栏悟空聊架构 | 公众号

    无法获得 varlibdpkglock - open (11: 资源临时不可用)

    一、无法获得 /var/lib/dpkg/lock – open (11: 资源暂时不可用) 在用sudo apt-get install 安装软件时,由于速度太慢,想换个软件源,直接关闭了终端,apt-get 但进程没有结束,结果终端提示 “E: 无法获得 /var/lib/dpkg/lock – open (11: 资源暂时不可用) E: 无法锁定管理目录(/var/lib/dpkg/),是否有其他进程正占用它

    6.7K30发布于 2018-06-26
  • 来自专栏python教程

    C++11多线程编程(二)——互斥mutex用法

    那么为什么要出现多线程这个东西呢?一句话概括的话。 为了保证数据的准确性! 这个就是用到这个东西。 执行完那个代码之后就可以释放,然后B线程就是来抢夺控制权了,一旦B获得了控制权也给自己上了,防止在执行关键地方的时候被别人夺去控制权。那么C++如何实现加锁的过程的呢? 以上就是C++中关于互斥的机制,相当的简单容易理解。

    52010编辑于 2024-01-10
  • 来自专栏南桥谈编程

    C++11第五弹:线程库 | 互斥 | 原子操作

    thread类的简单介绍 在C++11之前,涉及到多线程问题,都是和平台相关的,比如windows和linux下各有自己的接口,这使得代码的可移植性比较差。 C++11中最重要的特性就是对线程进行支持了,使得C++在并行编程时不需要依赖第三方库,而且在原子操作中还引入了原子类的概念。要使用标准库中的线程,必须包含< thread >头文件。 互斥文档 lock_guard 在使用lock和unlock时,如果中间抛异常,那么就无法解锁,就是死锁。 将锁住,除了作用域后,会调用析构函数,解锁。 条件变量通常与互斥(std::mutex)一起使用,以确保线程在等待或通知条件时不会引发数据竞争。

    29510编辑于 2024-09-20
  • 来自专栏Java面试

    MySQL、加锁机制(超详细)—— 分类、全局、共享、排他;表、元数据、意向;行、间隙、临键;乐观、悲观

    文章目录一、概述1.1 MySQL的由来1.2 锁定义1.3 分类二、共享与排他2.1 共享(S)2.2 排他(X)2.3 MySQL的释放三、全局3.1 介绍 3.2 语法 3.3 特点四、表级4.1 介绍4.2 表4.3 元数据(Meta Data Lock)4.4 意向(Intention Lock)五、行级5.1 介绍5.2 行 / 记录(Record Lock )5.3 间隙(Gap Lock)5.4 临建(Next-Key Lock)5.5 行的粒度粗化六、页面、乐观与悲观6.1 页面6.2 乐观6.3 悲观七、加锁规则八、总结一、概述1.1 这里的元数据可以简单理解为一张表的表结构意向(分为意向共享、意向排他):这个是InnoDB中为了支持多粒度的,为了兼容行、表而设计的,使得表不用检查每行数据是否加锁,使用意向来减少表的检查行级 、页面、乐观与悲观锁上述对MySQL两种较为常见的粒度进行了阐述(共享与排他,全局、表级、行级),接着再来看看页面、乐观与悲观6.1 页面页面是Berkeley DB存储引擎支持的一种粒度

    33.6K1733编辑于 2024-06-24
  • 来自专栏软件工程

    独占(写)共享(读)互斥

    独占:指该一次只能被一个线程所持有。对ReentrantLock和Synchronized而言都是独占 共享:指该可被多个线程所持有。 对ReentrantReadWriteLock其读是共享,其写是独占。 读的共享可保证并发读是非常高效的,读写,写读,写写的过程是互斥的。 使用方法 声明一个读写 如果需要独占则加从可重入读写里得到写demo 如果需要共享则加从可重入读写里得到读demo ReentrantReadWriteLock实现原理简单分析 Sync是如何同时表示读与写? ,低16位表示写个数 一个线程获取到了写,并且重入了两次,低16位是3,线程又获取了读,并且重入了一次,高16位就是2 读的写的获取主要调用AQS的相关Acquire方法,其释放主要用了相关Release

    1.7K30编辑于 2022-05-13
  • 来自专栏Lambda

    最全Java详解:独享共享+公平非公平+乐观悲观

    最全Java详解:独享/共享+公平/非公平+乐观/悲观 在Java并发场景中,会涉及到各种各样的如公平,乐观,悲观等等,这篇文章介绍各种的分类: 公平/非公平 可重入 独享/共享 乐观/悲观 分段 自旋 最全Java详解:独享/共享+公平/非公平+乐观/悲观 乐观 VS 悲观 乐观与悲观是一种广义上的概念,体现了看待线程同步的不同角度 最全Java详解:独享/共享+公平/非公平+乐观/悲观 3.总之: 悲观适合写操作多的场景,先加锁可以保证写操作时数据正确。 最全Java详解:独享/共享+公平/非公平+乐观/悲观 3.典型应用: java jdk并发包中的ReentrantLock可以指定构造函数的boolean类型来创建公平和非公平( Java线程 详细可以参考:高并发编程系列:4种常用Java线程的特点,性能比较、使用场景 本文标题:最全Java详解:独享/共享+公平/非公平+乐观/悲观 转载请保留页面地址:http

    1.1K20编辑于 2022-04-13
  • 来自专栏mysql

    MySQL锁相关总结|悲观、乐观、读、写、表、行、页面、间隙、临键

    总体上分成两种:乐观和悲观类型上也是两种:读和写 的粒度上可以分成五种:表,行,页面,间隙,临键 下面我们就来详细讲一下这些 1. 写又称为排他或者X(Exclusive Lock),如果当前写未释放,他会阻塞其他的写和读。 5. 表也称为表级,就是在整个数据表上对数据进行加锁和释放。 行也称为行级别,就是在数据行上对数据进行加锁和释放。特点:开销大,加锁慢,粒度小,并发度高,冲突概率最小。 在mysql的InnoDB存储引擎中有两种行,排他和共享。 共享:允许一个事务读取一行数据,但不允许一个事务对加了共享的当前行增加排他。排他:允许当前事务对数据行进行增删改查操作,不允许其他事务对增加了排他的数据行增加共享和排他。 间隙会锁住 (7,10], (10,21] 这两个间隙。不过间隙只会在 可重复读事务隔离级别 下才会生效。 9. 临键 临键就是行和间隙的组合,也可以理解为一种特殊的间隙

    89310编辑于 2024-09-07
  • 来自专栏菜鸟成长学习笔记

    MySQL中的(表、行,共享,排它,间隙

    本章我们着重讨论MySQL机制 的特点,常见的问题,以及解决MySQL问题的一些方法或建议。 Mysql用到了很多这种机制,比如行,表等,读,写等,都是在做操作之前先上锁。 页面:开销和加锁时间界于表和行之间;会出现死锁;锁定粒度界于表和行之间,并发度一般 。 从上述特点可见,很难笼统地说哪种更好,只能就具体应用的特点来说哪种更合适! 排他(X):又称写。允许获取排他的事务更新数据,阻止其他事务取得相同的数据集共享读和排他写。 另外,为了允许行和表共存,实现多粒度机制,InnoDB还有两种内部使用的意向(Intention Locks),这两种意向都是表。 意向共享(IS):事务打算给数据行共享,事务在给一个数据行加共享前必须先取得该表的IS。 意向排他(IX):事务打算给数据行加排他,事务在给一个数据行加排他前必须先取得该表的IX

    3.2K30发布于 2019-07-30
  • 来自专栏终码一生

    MySQL:表级、行级、共享、排他、乐观、悲观

    一文读懂所有,了解他们的优缺点和使用场景。 表级与行级 表级: table-level locking,锁住整个表。 开销小,加锁快。 不会死锁(一次性加载所需的所有表)。 InnoDB引擎支持表级和行级,默认为行级。 共享与排他 共享: 有称之为S、读。 语法:select id from t_table in share mode; 多个共享可以共存,共享与排他不能共存。 排他: 又称之为X、写。 乐观与悲观 乐观与悲观是逻辑上的。 乐观: 乐观:乐观地认为,并发问题很难发生。 悲观: 悲观:悲观地认为,并发问题极易发生。 悲观认为并发问题极易发生,所以每次操作,无论读写,都会对记录加锁,以防止其他线程对数据进行修改。 实现方式:数据库的行、读和写

    1.5K20编辑于 2022-04-14
领券