大师兄锁住了何金银,你错了(Java中的锁--进阶篇)
本篇文章参考以下博文
- java中的各种锁详细介绍
文章目录
- 前言
- 一、sync 锁原理
- 二、共享锁与排它锁与 reentrantWriteReadLock
- 三、进程锁与分布式锁
- 3.1 概念
- 3.2 分布式锁应该具备哪些条件:
- 3.3 分布式锁分类:
前言
上一节中我们介绍了,Java中锁的基本概念,以及 reentrantLock 实现的基础,有兴趣的同学可以点击这里跳转–Java中的锁–概念篇
本节我们继续上一节的内容,学习 synchronized 。
一、sync 锁原理
1. synchronized 属于 Java 关键字,对于 jvm 来说有特殊意义,关键字不能用作变量名,方法名,类名,包名或者当做参数。[例如: public void new 等]
2. Java 中每一个对象都有一个对象监视器( monitor ) 用来控制对象同步, monitor 底层是由 ObjectMonitor 实现( C++ )
3. 在 java 语言中存在两种内置 sync 语法
synchronized 语句: sync 语句再被 Java 编译成原语( byteCode )时,会在同步块的入口位置和退出位置插入字节码指令 minitorenter 与 minitorexit 线程执行到同步方法时会向 jvm 发送 minitorenter 指令,尝试去获取对象的 minitor ,当 minitor 被拥有之后就会被锁住,在访问完成之后执行 minitorexit 。
synchronized 方法:在 Class 文件的方法中将 sync 方法的 access flags 字段中的 acc_synchronized 标志位置为 1 ,表示该方法是同步方法并使用调用方法的对象或该方法所属的 Class 在 jvm 内部对象 Klass 中作为锁对象。
①当多个线程同时访问该方法,那么这些线程会先被放进 _EntryList 队列,此时线程处于 blocking 状态。
②当一个线程获取到了实例对象的监视器 ( monitor )锁,那么就可以进入 running 状态,执行方法,此时, ObjectMonitor 对象的 _owner 指向当前线程, _count + 1 表示当前对象锁被一个线程获取。
③当 running 状态的线程调用 wait() 方法,那么当前线程释放 monitor 对象,进入 waiting 状态, ObjectMonitor 对象的 _owner 变为 null , _count - 1 ,同时线程进入 _WaitSet 队列,知道有线程调用 notify() 方法唤醒该线程,则该线程重新获取 monitor 对象计入 _Owner 区
④如果当前线程执行完毕,那么也释放 monitor 对象,进入 waiting 状态, ObjectMonitor 对象的 _owner 变为 null , _count - 1 。
二、共享锁与排它锁与 reentrantWriteReadLock
2.1 定义 :共享锁又称毒锁, S 锁,排它锁又称 写锁,独占锁, X 锁,同属于悲观锁范畴。读写锁是对常规锁的粒化,用于优化应用程序,有效的控制资源的读写。读写锁只是一种资源访问的机制,并不是实际对资源加上了锁,使得加“读”锁的代码无法执行“写”资源操作。
2.2 特性 :
读读共享:当一个线程获取读锁后,后续线程依旧可以获取读锁,不会阻塞。类似概念还有“写写互斥”,“读写互斥”。
支持公平模式与非公平模式选择:默认非公平模式,连续竞争的非公平锁可能无限期的推迟一个或多个 reader 或者 writer 线程,吞吐量一般高于公平锁,内置写优先;公平模式利用一个近似到达的策略来争夺进入,当释放当前保存的线程时,可以为等待线程时间最长的 writer 线程分配写入锁,如果有一组等待时间大于所有正在等待的 writer 线程的 reader ,则分配读者锁。
reentrantWriteReadLock 读写锁支持可重入,支持写锁单向降级到读锁[获取写锁—>获取读锁—>释放写锁],避免大事务,高耗时任务,阻塞高响应查询任务的推进。
2.3 经典同步问题–读者写者问题(读者优先,写者优先,公平竞争)
2.3.1 问题描述:有读者和写者两组并发进程,共享一个文件,当两个以上的读进程同时访问共享数据时不会产生副作用,但若某个写进程和其他进程(读进程和写进程)同时访问共享数据时,则可能导致数据不一致的错误。
2.3.2 因此要求:①允许多个读者可以同时对文件执行读操作;②只允许一个写者往文件中写信息;③任一写者在完成写操作之前不允许其他读者或写者工作;④写者执行写操作前,应让已有的读者写者全部退出。
2.3.3 同时还提供三种策略:1.读者优先:总是给读者优先权,只要没有写操作,读者就能获取到访问权,常用语阅读量远高于修改量的系统;2.写者优先:将读者延迟到所有等待的写者和活动的写者完成之后,常用语修改量巨大的系统,票务系统;公平竞争:基本保持先到先服务的原则。
2.3.4 总述:无论三种中的哪一种,在没有程序占用临界区市,读者与写者之前的竞争都是公平的,所谓的不公平是在读者优先或者写者优先模式中,优先方只要占用了临界区的主导权,除非有没优先方提出要求,否则始终是优先方的程序占有临界区,反观非优先方即使某一次占用了临界区,那么释放后,回到了没有程序占用临界区的情况,非优先方又要重新和优先方公平竞争,所谓的优先可以理解为占有临界区后,便可以对临界区进行“垄断”。在读者优先中,当读者在里面占用文件的时候,外部的读者可以直接读取文件。在写者优先中,每一个写者操作文件之后总是优先唤醒等待的写者。
三、进程锁与分布式锁
3.1 概念
进程锁与分布式锁的功能基本一致,都是用来保证资源操作的同步性,解决多操作系统之间部分数据的不可见性。只是作用范围大小的不同。
作用范围:分布式锁 > 进程锁 > 线程锁。
实现分布式锁要依靠第三方存储介质来存储锁的元数据等信息。
3.2 分布式锁应该具备哪些条件:
1.在分布式系统环境下,一个方法在同一时间内只能被一个机器的一个线程执行。
2. 高可用的获取锁与释放锁
3. 高性能的获取锁与释放锁
4. 具备可重入性
5. 具备锁失效机制,防止死锁
6. 具备非阻塞锁特性
3.3 分布式锁分类:
3.3.1 基于数据库实现分布式锁
利用数据库唯一索引特性 :
CREATE TABLE "public"."tbl_lock" (
"id" int4 NOT NULL,
"method_name" carchar(32) COLLATE "default" NOT NULL,
"desc" carchar(255) COLLATE "default",
"ops_date" date,
CONSTRAINT "tbl_lock_pkey" PRIMARY KEY ("id")
)
WITH (OIDS=FALSE)
;
ALTER TABLE "public"."tbl_lock" OWNER TO "postgres";
COMMENT ON COLUMN "public"."tbl_lock"."id" IS '主键';
COMMENT ON COLUMN "public"."tbl_lock"."method_name" IS '锁定方法名';
COMMENT ON COLUMN "public"."tbl_lock"."desc" IS '备注';
COMMENT ON COLUMN "public"."tbl_lock"."ops_date" IS '操作时间';
CREATE UNIQUE INDEX "_method_name" ON "public"."tbl_lock" USING btree ("method_name");
获取锁( insert )解锁( delete )
insert INFO tbl_lock (method_name, decs) VALUES ('methodName', 'message');
delete * from tbl_lock where method_name = 'methodName'
method_name 作为唯一约束,这里如果有多个请求同时提交到数据库的话,数据库会保证只有一个操作成功,其余返回 sql 报错。
利用数据库 select update :
表结构:
CREATE TABLE "public"."tbl_lock" (
"id" int4 NOT NULL,
"method_name" carchar(32) COLLATE "default" NOT NULL,
"desc" carchar(255) COLLATE "default",
"ops_date" date,
CONSTRAINT "tbl_lock_pkey" PRIMARY KEY ("id")
)
WITH (OIDS=FALSE)
;
ALTER TABLE "public"."tbl_lock" OWNER TO "postgres";
COMMENT ON COLUMN "public"."tbl_lock"."id" IS '主键';
COMMENT ON COLUMN "public"."tbl_lock"."method_name" IS '锁定方法名';
COMMENT ON COLUMN "public"."tbl_lock"."desc" IS '备注';
COMMENT ON COLUMN "public"."tbl_lock"."ops_date" IS '操作时间';
CREATE UNIQUE INDEX "_method_name" ON "public"."tbl_lock" USING btree ("method_name");
获取锁与释放锁(select update)
select id method_name,state from tbl_lock where state = '0' and method_name = 'methodName';
update tbl_lock set state = 0 where method_Name = 'methodName' and state = '0'
利用数据库更新的特性,如果没有更新到一行数据,返回结果为 0,代表资源已被其他系统占用。
隐患与对策 :
1.这把锁强依赖数据库的可靠性,数据库若是单点,一旦数据挂掉,会导致业务系统不可用。
2.利用数据库加锁没有失效时间,一旦解锁操作失败,会导致致锁记录一直在数据库中,其它线程无法再次获得锁。
3.这把锁只能是非阻塞的,因为数据的操作特性,一旦操作失败,或者数据没有更新数据库直接返回。没有获取锁的线程并不会排队,想要再次尝试获取锁就需要再次出发操作。
4.这把锁是非重入的,同一个线程在没有释放锁之前无法再次获得该锁。
******* 分割线 *******
1.解决单点问题,那么增加数据库的主从配置。加锁做到双向同步,保证主从的快速切换。
2.解决没有超时失效机制,那么增加定时任务,记录加速时间,每隔一定是的时间清理超时数据。
3.解决非阻塞问题,可以设定重试机制,例如自旋, while(true){} 等,直到操作成功。
4.解决非重入问题,可以在表中增加字段记录获取锁的主机信息和线程信息,那么下次再获取锁之前先进行数据比对,如果比对一致,那么就可以再次获取多锁。
3.3.2 基于缓存实现分布式锁(redis)
实现基础 :
1. redis 为单进程单线程模式,采用队列模式将并发访问控制变成串行访问,且多客户端对 redis 的连接并不存在竞争关系。
2. redis 的 SETNX 命令可方便的实现 分布式锁, SETNX(set if Not exist) 语法: SETNX key value; 设置成功返回 1,失败返回 0,且不作任何改动。
3.通过 delete key 可以快速的完成锁释放,由于 redis 中 key 可以设置过期时间,在业务发生不可知错误的情况下,会自然过期。
4.以 key-value 键值对存储数据的 redis 可以辅助存储包括主机信息在内的锁相关持有信息。
5. redis 在 2.6 版本之后推出脚本功能,允许开发者使用 lua 语言编写脚本传到 redis 中执行。
lua 脚本优点有:
-
减少网络开销——脚本可以一次性完成,减少代码调用的多次 redis 网络请求。
-
原子操作—— redis 会将整个脚本作为一个整体执行,中间不会被其他命令打断插入,在 java 业务代码中除非刻意控制,不然很难做到原子性,尤其是分布式系统中。
-
复用性高——客户端发送的脚本会永久的存在 redis 中,意味着其他客户端可以使用这一脚本而不需要使用代码来完成同样的逻辑。(注意 redis 中的 lua 脚本不可以执行耗时操作,一旦执行耗时操作,就会阻塞 redis 的主线程,影响其他客户端, redis 为 lua 脚本配置了默认超时机制,一般为5s ,超出后将被中止执行)
redisTemplate + lua实现分布式 :
lock.lua
-- Set a lock
-- 如果获取锁成功,则返回 1
local key = KEYS[1]
local content = ARGV[1]
local ttl = tonumber(ARGC[2])
local lockSet = redis.call('setnx', key, content) --setnx操作,lua 中call函数代表 redis 执行
if lockSet == 1 thenredis.call('PEXPIRE', key, ttl) -- 执行成功并返回 1 ,并设置过期时间
else--如果 value 相同,则认为是同一个线程请求,认为是同步锁local value = redis.call('get', key)if(value == content) then --使用 content 记录加锁主机lockSet = 1;redis.call('PEXPIRE', key, ttl)end
end
return lockSet
unlock.lua
-- unlock key
local key = KEYS[1]
local content = ARGV[1]
local value = redis.call('get', key)
if value == content thenreturn redis.call('del', key) --将 key 进行 delete 操作释放锁
elsereturn 0
end
redisson 上实现高性能分布式锁 :
1. Redisson 是架设在 redis 基础上的一个 Java 驻内存数据网络,建立在 netty 基础上,充分利用 redis 键值对数据库提供的一系列优势,为使用者提供了一系列具有分布式特性的常用工具类,使得原本作为协调单机多线程的并发程序的工具包获得了协调分布式多机多线程并发系统的能力,大大降低了设计和研发大规模分布式系统的难度。
2. Redisson 众多特性,其中提供了分布式锁的工具类。
3. Redisson 支持哨兵模式( Sentinel 模式)来实现高可用
- ①监控: Sentinel 会不断的检查主从服务器是否运转正常
- ②提醒:当被监控的某个 redis 服务器出现问题是, Sentinel 可以通过 API 向管理员或者应用程序发出通知。
- ③自动故障转移:当一个主服务器不能工作时, Sentinel 会开始一次自动故障迁移操作,它会将失效的主服务器的其中一个从服务器升级为新的主服务器,并将失效的主服务器的其他从服务器改为复制新的主服务器,当客户端视图连接失效的服务器时,集群也会向客户端返回新主服务器的地址,使得集群可以使用新的主服务器代替失效的服务器。
4. Redisson 为分布式锁提供看门狗( watch dog )延时机制
- ① redis 的 key 存在超时时间是一种有效的防资源锁死策略,但是存在以下场景A,B 在执行业务,A 加了分布式锁并设置了 key 超时时间,如果 A 的锁越过超时时间,但是 A 业务任然在运行,那么 B 业务也就可以正常拿到锁了,此时加锁失效。
- ②因场景1, redisson 为分布式锁 tryLock 方法提供了看门狗机制,默认情况下, redisson 的锁持有时间为 30s ,看门狗检测到执行程序执行到 30 - 30/3 = 20s 依旧没有释放锁,那么会主动为加锁时间续期 30s 。
5. Redisson 内封装了多种锁( RLock)用于满足不同的业务场景
- ① 可重入锁( Renentrant Lock ): redisson.getLock(key) 是最常用的方法,支持过期解锁功能,在不 expire 的情况下,默认锁持有 10s 。之后自动解锁; redisson.getLock(key).tryLock() 可以配置看门狗过期续时长。
- ② 公平锁( Fair Lock ): redisson.getFairLock(key) 在提供了自动过期解锁功能的同时,保证了当多个 Redisson 客户端线程同时请求加锁时,满足先到服务原则。
- ③ 联锁( MultiLock ): redisson 为满足同一时间多线程多资源分别占用的业务场景而提供的一种加锁机制,将多个 Rlock 关联为一个联锁,所有的锁在加锁成功后才算作成功。
Rlock lock1 = redisson1.getLock("lock1");
Rlock lock2 = redisson1.getLock("lock2");
Rlock lock3 = redisson2.getLock("lock3");
RedissonMultiLock Mlock = new Redisson MultiLock(lock1, lock2, lock3);
- ④ 读写锁( ReadWriteLock ):满足 java 线程中的可重入读写锁( ReentrantWriteReadLock )功能相似功能,保证执行系统可以在获取多个读锁,但是最多同时只有一个写锁。
ReadWriteLock rwlock = redisson.getLock("RWLock");
rwlock.readLock().lock(); rwlock.writeLock().lock();
- ⑤ 闭锁( countDownLatch ):闭锁并不是实际意义上的锁,它是一种同步工具,可以延迟线程直到其达到最终状态。存在如下场景:当服务器执行一些操作时,可能需要调用多个接口,等待返回结果,各个接口相互独立,为例提高效率,一般设计成为异步获取结果,当所有异步线程都完成后,通知主线程进行下一步操作。闭锁就能完成上述场景,让多个线程执行完后通知主线程,若未执行完成,主线程会阻塞,等待其执行完毕后再进行下一步操作。
concurrent 包中提供的 countDownLatch 是一种灵活的闭锁实现,基本实现原理为初始化计数器为 nThread [实际操作线程数] 每执行完一个操作使用 countDown() 方法对计数器减 1,在计数器未减到 0 之前(包括主线程),使用 await 方法使主线程阻塞等待,等到计数器为 0 时放行主线程。在 redisson 中提供 RCountDownLatch 对象来实现与 countDownLatch 一致的功能用于分布式异步业务。
RCountDownLatch latch = redisson.getCountDownLatch("ops");
latch.trySetCount(1);
latch.await();
// 在其他线程中或者jvm中执行
RCountDownLatch latch = redisson.getCountDownLatch("ops");
latch.countDown
- ⑥ 红锁( RedLock ): redLock 是 redis 官方提供的关于使用 redis 实现分布式锁的一种算法那,旨在为分布式锁提供更好的可靠性, Redisson 基于 redlock 算法推出了 RedissonRedLock 工具包。
高效分布式锁应该具有的特性:
1. 一致性:不管什么时候,同时只能有一个客户持有锁。
2. 区分容忍性:不会死锁,最终一定会得到锁,就算持有锁的客户端宕机或者发生网络错误。
3. 可用性:只要 redis 的大多数节点工作正常,客户端就应该都能加锁 / 解锁。
大多数基于 redis 的分布式锁现状:
用 redis 实现分布式锁最简单的方式就是创建一个键值并设定过期时间,每个锁最终都会被释放,释放锁时删除 key 即可,表面上这个模式没有任何问题,但是存在隐患。
场景一:在集群中 Redis 的 mater 节点单点故障时业务受到影响,所以一般会增加 slave 节点,但是通过 master - save 模式来解决容灾,却让分布式锁失去了一致性,因为 redis 是通过异步复制来完成主从复制的,在 master 收到写命令后,先在内部写入数据,然后再异步发送给 slave node 如下图:
场景二:因为网络延时,客户端 1 长时间阻塞,设定的 T 内 A锁过期,这时客户端 2 获取到了 A 锁,此时客户端1的网络恢复正常,导致两个客户端同时操作资源。
如何正确实现单例方案?(非集群 redis 环境)
lua 脚本的加锁核心语句为 setnx key value;pexpire time;setnx 保证只有在没有 key 的情况下才能设置这个 key 值,超时时间设置为 time , key 的值设置为 value 需要做到 value 在所有获取锁的客户端中是唯一的,利用 value 就可以在单机环境下保证安全的释放锁,再删除 key 时当且仅当这个 key 存在,且 value 为解锁时传入的预期值才可以删除成功,如果不这么做会存在以下场景:
C1 获取到锁 A,执行无异常但是耗时,锁自动过期,C2 就可以再次获取到锁,此时 C1 已经完成了业务,调用解锁方法,在未做任何保护的情况下 [ value 校验],C1 使得 C2加上的锁过期,C1,C2 的执行结果都未可知。
在 redis 集群中,针对上一节中 redis 分布式锁现状暴露的问题, redis 官方提出了 redlock 加锁模型,假设我们有 N 个 Redis master 节点,这些节点都是完全独立的,我们不用任何肤质算法或者隐含的分布式协调算法,按照上方的单例方案,我们在这个集群中的每一个节点都采用如上方案加锁与解锁,假定 N 为 5 ,我们保证在服务器上运行 5 个 master 节点来保证大多数情况下都不会出现宕机的情况,当有一个客户端 C1 想要加锁时,需要如下几个操作:
① 获取当前的时间 t1 (毫秒)。
② 轮流用相同的 key A 在 n 个节点上请求锁,因为加锁操作本身是耗时操作(5-50ms)在请求每一个节点上锁完成时,总有一个节点(大概率是第一个写入 key 的节点)的预期释放锁时间要比最终释放锁的时间要小得多,加锁过程有了一段程序执行时间差,遇到其中某一个 master 宕机时,直接跳过继续执行。
③ 客户端计算完成第二部的花费时间差( t3 - t1 ),只有当客户端在大多数( n / 2 + 1 ) master 节点上获取锁,而且总消耗的时间不会超过 T 那么可以认定为加锁成功,加锁成功时其他客户端来竞争锁,加锁成功的节点最多也只能达到 ( n % 2 - 1 ) 个会被判定为加锁失败。
④ 如果判定获取锁成功了,那现在锁自动释放时间就是 T - (t3 - t1) 。
⑤ 如果锁获取失败了,不管是因为获取成功的锁不超过一半还是因为 T - (t3 - t1) < 0 ,客户端都会去每一个 master 上释放锁,建立在单例方案上,释放锁并不会影响到下一个加持相同锁的客户端。
redlock 是否完美?
redlock 有效解决了因为主从关系异步复制导致锁失效的问题,但是依旧不够完美,存在以下场景:
① 存在 5 个 master 节点(A-E)客户端,客户端 C1 成功在 A, B,C上加锁,DE没有锁住,
② 节点 C 发生崩溃重启,但是 C 节点未做持久化保护,(redis 持久化数据周期为 1s 一次,极有可能丢失 1s 内的数据),重启后未锁住 C
③ 客户端 2 此时锁住了 C,D,E,判定为获锁成功,最终导致两把红锁通过。
redlock 依然对于客户端长时间阻断然后恢复业务的场景并没有做到很好的资源保护。
redlock 算法的第二步存在关键问题,那就是实际上减少了客户端真正持有资源的时间,对于最终剩余的时间多少算长或者短是无法规定的。
redlock 算法对于各个节点之间的时间依赖性非常的强,若 N 个节点中某个 / 某些节点发生时间跳跃,就会存在部分节点先行释放锁,导致其他锁竞争大于 n / 2 + 1 的局面。
关于红锁的争论当然也一直存在,有兴趣的同学可以访问官网了解更多。
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
相关文章
- Jsoup
使用Jsoup.connect(String url)方法: Document doc = Jsoup.connect(“https://jsoup.org/”).get(); String title = doc.title(); IDEA 实例: @Test public void Demo03() throws IOException {//请求jsoup主页并获取到网页的标题Document doc = Jsoup.connect("https…...
2024/5/5 17:35:05 - JS阻止冒泡和取消默认事件(默认行为)
阻止事件冒泡function stopPropagat(e) {if (e && e.stopPropagation) {e.stopPropagation();//标准浏览器} else {window.event.cancelBubble = true;//兼容IE的方式来取消事件冒泡}}阻止默认行为function stopDefault(e) {if (e && e.preventDefault) {e.pre…...
2024/4/29 13:24:26 - 参数相关例子
例1: var a = 10; function test(a) {a -= 3; } test(a); console.log(a);<!-- test(a)是带参数进入函数的,但是在函数里没有return a,且没有把a重新赋值a=test(a),所以下面打印a依然为10。如若以带参数执行函数且想拿到改变后的a,需在函数中添加retur…...
2024/5/1 8:55:59 - 44template代码膨胀
非类型参数膨胀类型参数膨胀共同点:共享代码,解决代码膨胀问题...
2024/4/29 13:24:19 - TypeError: ‘BaseQuery‘ object is not callable问题解决
1.今天在自己做的网址进行测试时显示TypeError: ‘BaseQuery’ object is not callable,在网上进行搜索后发现是因为我在用flask的程序调用mysql,mysql没有找到对应的数据,所以无法运行;这是sql代码都正常的情况下出的问题: debug提醒上显示app_students = App_student.qu…...
2024/4/29 1:02:22 - 2 计算机组成原理第二章 数据的表示和运算 定点数运算 浮点数运算
文章目录1 进制转换2 定点数表示及其运算2.1 定点数表示2.1.1 真值→补码2.1.2 补码→真值2.1.3 [XT]补 →[-XT]补2.1.4 真值、原码、反码、补码转换关系图形总结2.2.4 移码2.2 定点数运算2.2.1 移位运算2.2.2 定点数加减运算2.2.3 溢出判断判溢出方法一判溢出方法二判溢出方法…...
2024/4/29 13:24:10 - ES6中函数的扩展
ES6中函数的扩展一、箭头函数使用注意点二、函数的不定参数三、函数的拓展实参 一、箭头函数 let fn=(num1,num2)=>{return num1+num2 }let fn=num1=>num1+num2简写注意事项 省略小扩号:当参数只有一个时 省略大扩号:当函数体只有一句时, 当函数体只有一句时,且是return…...
2024/4/29 2:13:22 - VUE+Element学习笔记之登录页面跳转首页
要求:使用Vue+ElementUI对用户帐号、密码进行验证登录功能登录后跳转到首页用户退出登录退出登录返回到登录页面 基于ElementUI前端模版“vuetify-material-dashboard-master”编辑登录页面<template><v-app ><v-container tag="section" class=&quo…...
2024/4/29 2:13:20 - oracle创建表空间、用户
sysdba连接上oralce 创建临时表空间,名称是web_temp注意tablespace、tempfileselect name from v$tempfile;--查出当前数据库临时表空间,下面创建临时表空间会使用里面的存放路径; /opt/oracle/oradata/orcl/temp01.dbf[oracle@ylm-100 ~]$ cd /opt/oracle/oradata/orcl [or…...
2024/4/29 13:24:06 - JTA和JTS
JTA,即Java Transaction API,JTA允许应用程序执行分布式事务处理–在两个或多个网络计算机资源上访问并且更新数据。JDBC驱动程序的JTA支持极大地增强了数据访问能力。 JTA事务比JDBC事务更强大。一个JTA事务可以有多个参与者,而一个JDBC事务则被限定在一个单一的数据库连接…...
2024/4/29 13:24:02 - 文献阅读-ICRA2020-血管内介入治疗中考虑光流引导弯曲的 端到端实时导管分割
文章序号、所属单元及链接:1206-Computer Vision for Medical Robots 一作所属单位:Imperial College London 读后体会:论文创新点:时间一致性、光流法。 血管内介入治疗中考虑光流引导弯曲的端到端实时导管分割 AbstractIntroductionRelated WorkData CollectionA.CathBot…...
2024/4/29 13:23:59 - 打造离线下载服务器-AriaNG
步骤1:环境配置 由于AriaNG需要对外监听端口进行管理 本文将通过Docker方式部署并以Nginx反向代理方式实现离线下载面板的对外访问及环境隔离Docker部署centos7虚拟机docker run -itd --privileged=true --name=ccaa --network=bridge --restart=always -v /root/download:/ro…...
2024/4/29 13:23:53 - SSMx项目中遇到乱码问题的解决
在web.xml加入如下的内容 <!-- 配置编码过滤器 --><filter><filter-name>EncodingFilter</filter-name><filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class><init-param><param-name>enco…...
2024/4/29 13:23:49 - 我的第一个Django程序,搭建环境、添加餐馆功能的实现
<<<<<<< HEAD MyFirstDjangoProject ======= 使用Django实现餐馆的添加功能 1.所使用的环境、框架版本、工具*运行环境 *python 3.7.4*MySQL 5.5.40*框架版本*Django === 3.1.0*pymysql === 0.10.0*工具版本*PyCharm Professional v2019.3.3*SQLyog Pr…...
2024/4/29 13:23:46 - 手撕推排序
前 K 个高频元素class Solution:# 小根堆调整def heapAdjust(self,L,start,end):i = start; j = 2*i; temp = L[start]while j <= end:if j < end and L[j][1] > L[j+1][1]:j = j+1if temp[1] > L[j][1]:L[i] = L[j]; i = j; j = 2*ielse:breakL[i] = temp# 建立小…...
2024/4/29 13:23:42 - arguments,callee,caller
arguments 定义函数时没有定义参数 如果实参数量大于形参时,使用arguments arguments只能出现在函数语句块中,不需要定义,直接使用。 用于当前函数的参数不固定数量。 function fn1(){ console.log(arguments[0],arguments[1]) console.log(arguments); } fn1(1,2,3,4) 求和 f…...
2024/4/29 13:23:38 - 初中信奥学习&文化课总结
前言 看到大爷们都写辽,赶紧过来水一发小学 不得不说小学时候的文化课真的水 数学常年99、100,英语差不多都是班级一二,语文95上上下下的蹦跶 然后是信奥 三年级一次电脑课被叫出去,都是被班主任和数学老师推荐的一些”比较有脑子“的选手 然后硬生生测了一场初中的数学试卷…...
2024/4/29 13:23:35 - 谷歌技术探究之BigTable
文章目录引言BigTable是什么数据模型基本实现思路优化总结 引言 其实对于这篇论文的简单介绍网上已经有很多了,所以这篇文章并不想去陈述其设计,而是想简单说一说我认为的亮点所在,虽说如此,我还是觉得我并没有get到什么其他人没有get到的东西,所以这是一篇比较无聊的纯记…...
2024/4/28 14:29:40 - # Base64 解密加密 DES 解密加密 PasswordUtils解加密工具类
Base64 解密加密 DES 解密加密 PasswordUtils解加密工具类 package com.li.core.utils;import org.bouncycastle.util.encoders.Base64; import sun.misc.BASE64Decoder; import sun.misc.BASE64Encoder;import java.security.SecureRandom; import java.security.Key; import …...
2024/4/29 13:23:26 - 记录程序人生2020.8.11
1.晚休的时间总是短暂的,甚至你都没有来得及闭眼呢就需要将它睁开。上眼皮与下眼皮一直恋恋不舍的分开,天花板渐渐的呈现出来,该起了! 2.5点一刻准时坐在外面的水泥台阶上,飞速打开屏幕中的背单词软件,%……¥*&($&*aUIs8…………开始背!背单词的时间只有20分钟…...
2024/4/29 13:23:22
最新文章
- Mybatis扩展
1. Myabtis注解开发 这几年来注解开发越来越流行,Mybatis也可以使用注解开发方式,这样我们就可以减少编写Mapper映射文件了。我们先围绕一些基本的CRUD来学习,再学习复杂映射多表操作。 1.1 常见注解 Insert:实现新增 Up…...
2024/5/5 18:08:24 - 梯度消失和梯度爆炸的一些处理方法
在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言,在此感激不尽。 权重和梯度的更新公式如下: w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...
2024/3/20 10:50:27 - [Spring Cloud] gateway全局异常捕捉统一返回值
文章目录 处理转发失败的情况全局参数同一返回格式操作消息对象AjaxResult返回值状态描述对象AjaxStatus返回值枚举接口层StatusCode 全局异常处理器自定义通用异常定一个自定义异常覆盖默认的异常处理自定义异常处理工具 在上一篇章时我们有了一个简单的gateway网关 [Spring C…...
2024/5/3 22:05:18 - Docker Desktop+WSL2安装到自定义路径
现在大多数软件实在太“流氓”了,在安装过程中,根本不让你选择安装路径,默认安装到$HOME下(windows C盘),随着软件的使用增多,可能磁盘空间不够,这个时候就想着,看看某些…...
2024/5/4 9:55:38 - 416. 分割等和子集问题(动态规划)
题目 题解 class Solution:def canPartition(self, nums: List[int]) -> bool:# badcaseif not nums:return True# 不能被2整除if sum(nums) % 2 ! 0:return False# 状态定义:dp[i][j]表示当背包容量为j,用前i个物品是否正好可以将背包填满ÿ…...
2024/5/4 12:05:22 - 【Java】ExcelWriter自适应宽度工具类(支持中文)
工具类 import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.CellType; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet;/*** Excel工具类** author xiaoming* date 2023/11/17 10:40*/ public class ExcelUti…...
2024/5/5 12:22:20 - Spring cloud负载均衡@LoadBalanced LoadBalancerClient
LoadBalance vs Ribbon 由于Spring cloud2020之后移除了Ribbon,直接使用Spring Cloud LoadBalancer作为客户端负载均衡组件,我们讨论Spring负载均衡以Spring Cloud2020之后版本为主,学习Spring Cloud LoadBalance,暂不讨论Ribbon…...
2024/5/4 14:46:16 - TSINGSEE青犀AI智能分析+视频监控工业园区周界安全防范方案
一、背景需求分析 在工业产业园、化工园或生产制造园区中,周界防范意义重大,对园区的安全起到重要的作用。常规的安防方式是采用人员巡查,人力投入成本大而且效率低。周界一旦被破坏或入侵,会影响园区人员和资产安全,…...
2024/5/4 23:54:44 - VB.net WebBrowser网页元素抓取分析方法
在用WebBrowser编程实现网页操作自动化时,常要分析网页Html,例如网页在加载数据时,常会显示“系统处理中,请稍候..”,我们需要在数据加载完成后才能继续下一步操作,如何抓取这个信息的网页html元素变化&…...
2024/5/5 15:25:47 - 【Objective-C】Objective-C汇总
方法定义 参考:https://www.yiibai.com/objective_c/objective_c_functions.html Objective-C编程语言中方法定义的一般形式如下 - (return_type) method_name:( argumentType1 )argumentName1 joiningArgument2:( argumentType2 )argumentName2 ... joiningArgu…...
2024/5/4 23:54:49 - 【洛谷算法题】P5713-洛谷团队系统【入门2分支结构】
👨💻博客主页:花无缺 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 本文由 花无缺 原创 收录于专栏 【洛谷算法题】 文章目录 【洛谷算法题】P5713-洛谷团队系统【入门2分支结构】🌏题目描述🌏输入格…...
2024/5/4 23:54:44 - 【ES6.0】- 扩展运算符(...)
【ES6.0】- 扩展运算符... 文章目录 【ES6.0】- 扩展运算符...一、概述二、拷贝数组对象三、合并操作四、参数传递五、数组去重六、字符串转字符数组七、NodeList转数组八、解构变量九、打印日志十、总结 一、概述 **扩展运算符(...)**允许一个表达式在期望多个参数࿰…...
2024/5/4 14:46:12 - 摩根看好的前智能硬件头部品牌双11交易数据极度异常!——是模式创新还是饮鸩止渴?
文 | 螳螂观察 作者 | 李燃 双11狂欢已落下帷幕,各大品牌纷纷晒出优异的成绩单,摩根士丹利投资的智能硬件头部品牌凯迪仕也不例外。然而有爆料称,在自媒体平台发布霸榜各大榜单喜讯的凯迪仕智能锁,多个平台数据都表现出极度异常…...
2024/5/4 14:46:11 - Go语言常用命令详解(二)
文章目录 前言常用命令go bug示例参数说明 go doc示例参数说明 go env示例 go fix示例 go fmt示例 go generate示例 总结写在最后 前言 接着上一篇继续介绍Go语言的常用命令 常用命令 以下是一些常用的Go命令,这些命令可以帮助您在Go开发中进行编译、测试、运行和…...
2024/5/4 14:46:11 - 用欧拉路径判断图同构推出reverse合法性:1116T4
http://cplusoj.com/d/senior/p/SS231116D 假设我们要把 a a a 变成 b b b,我们在 a i a_i ai 和 a i 1 a_{i1} ai1 之间连边, b b b 同理,则 a a a 能变成 b b b 的充要条件是两图 A , B A,B A,B 同构。 必要性显然࿰…...
2024/5/5 2:25:33 - 【NGINX--1】基础知识
1、在 Debian/Ubuntu 上安装 NGINX 在 Debian 或 Ubuntu 机器上安装 NGINX 开源版。 更新已配置源的软件包信息,并安装一些有助于配置官方 NGINX 软件包仓库的软件包: apt-get update apt install -y curl gnupg2 ca-certificates lsb-release debian-…...
2024/5/4 21:24:42 - Hive默认分割符、存储格式与数据压缩
目录 1、Hive默认分割符2、Hive存储格式3、Hive数据压缩 1、Hive默认分割符 Hive创建表时指定的行受限(ROW FORMAT)配置标准HQL为: ... ROW FORMAT DELIMITED FIELDS TERMINATED BY \u0001 COLLECTION ITEMS TERMINATED BY , MAP KEYS TERMI…...
2024/5/5 13:14:22 - 【论文阅读】MAG:一种用于航天器遥测数据中有效异常检测的新方法
文章目录 摘要1 引言2 问题描述3 拟议框架4 所提出方法的细节A.数据预处理B.变量相关分析C.MAG模型D.异常分数 5 实验A.数据集和性能指标B.实验设置与平台C.结果和比较 6 结论 摘要 异常检测是保证航天器稳定性的关键。在航天器运行过程中,传感器和控制器产生大量周…...
2024/5/4 13:16:06 - --max-old-space-size=8192报错
vue项目运行时,如果经常运行慢,崩溃停止服务,报如下错误 FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory 因为在 Node 中,通过JavaScript使用内存时只能使用部分内存(64位系统&…...
2024/5/5 17:03:52 - 基于深度学习的恶意软件检测
恶意软件是指恶意软件犯罪者用来感染个人计算机或整个组织的网络的软件。 它利用目标系统漏洞,例如可以被劫持的合法软件(例如浏览器或 Web 应用程序插件)中的错误。 恶意软件渗透可能会造成灾难性的后果,包括数据被盗、勒索或网…...
2024/5/4 14:46:05 - JS原型对象prototype
让我简单的为大家介绍一下原型对象prototype吧! 使用原型实现方法共享 1.构造函数通过原型分配的函数是所有对象所 共享的。 2.JavaScript 规定,每一个构造函数都有一个 prototype 属性,指向另一个对象,所以我们也称为原型对象…...
2024/5/5 3:37:58 - C++中只能有一个实例的单例类
C中只能有一个实例的单例类 前面讨论的 President 类很不错,但存在一个缺陷:无法禁止通过实例化多个对象来创建多名总统: President One, Two, Three; 由于复制构造函数是私有的,其中每个对象都是不可复制的,但您的目…...
2024/5/4 23:54:30 - python django 小程序图书借阅源码
开发工具: PyCharm,mysql5.7,微信开发者工具 技术说明: python django html 小程序 功能介绍: 用户端: 登录注册(含授权登录) 首页显示搜索图书,轮播图࿰…...
2024/5/5 17:03:21 - 电子学会C/C++编程等级考试2022年03月(一级)真题解析
C/C++等级考试(1~8级)全部真题・点这里 第1题:双精度浮点数的输入输出 输入一个双精度浮点数,保留8位小数,输出这个浮点数。 时间限制:1000 内存限制:65536输入 只有一行,一个双精度浮点数。输出 一行,保留8位小数的浮点数。样例输入 3.1415926535798932样例输出 3.1…...
2024/5/5 15:25:31 - 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...
解析如下:1、长按电脑电源键直至关机,然后再按一次电源健重启电脑,按F8健进入安全模式2、安全模式下进入Windows系统桌面后,按住“winR”打开运行窗口,输入“services.msc”打开服务设置3、在服务界面,选中…...
2022/11/19 21:17:18 - 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。
%读入6幅图像(每一幅图像的大小是564*564) f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...
2022/11/19 21:17:16 - 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...
win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面,在等待界面中我们需要等待操作结束才能关机,虽然这比较麻烦,但是对系统进行配置和升级…...
2022/11/19 21:17:15 - 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...
有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows,请勿关闭计算机”的提示,要过很久才能进入系统,有的用户甚至几个小时也无法进入,下面就教大家这个问题的解决方法。第一种方法:我们首先在左下角的“开始…...
2022/11/19 21:17:14 - win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...
置信有很多用户都跟小编一样遇到过这样的问题,电脑时发现开机屏幕显现“正在配置Windows Update,请勿关机”(如下图所示),而且还需求等大约5分钟才干进入系统。这是怎样回事呢?一切都是正常操作的,为什么开时机呈现“正…...
2022/11/19 21:17:13 - 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...
Win7系统开机启动时总是出现“配置Windows请勿关机”的提示,没过几秒后电脑自动重启,每次开机都这样无法进入系统,此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一:开机按下F8,在出现的Windows高级启动选…...
2022/11/19 21:17:12 - 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...
有不少windows10系统用户反映说碰到这样一个情况,就是电脑提示正在准备windows请勿关闭计算机,碰到这样的问题该怎么解决呢,现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法:1、2、依次…...
2022/11/19 21:17:11 - 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...
今天和大家分享一下win7系统重装了Win7旗舰版系统后,每次关机的时候桌面上都会显示一个“配置Windows Update的界面,提示请勿关闭计算机”,每次停留好几分钟才能正常关机,导致什么情况引起的呢?出现配置Windows Update…...
2022/11/19 21:17:10 - 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...
只能是等着,别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚,只能是考虑备份数据后重装系统了。解决来方案一:管理员运行cmd:net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...
2022/11/19 21:17:09 - 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?
原标题:电脑提示“配置Windows Update请勿关闭计算机”怎么办?win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢?一般的方…...
2022/11/19 21:17:08 - 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...
关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!关机提示 windows7 正在配…...
2022/11/19 21:17:05 - 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...
钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...
2022/11/19 21:17:05 - 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...
前几天班里有位学生电脑(windows 7系统)出问题了,具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面,长时间没反应,无法进入系统。这个问题原来帮其他同学也解决过,网上搜了不少资料&#x…...
2022/11/19 21:17:04 - 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...
本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法,并在最后教给你1种保护系统安全的好方法,一起来看看!电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中,添加了1个新功能在“磁…...
2022/11/19 21:17:03 - 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...
许多用户在长期不使用电脑的时候,开启电脑发现电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机。。.这要怎么办呢?下面小编就带着大家一起看看吧!如果能够正常进入系统,建议您暂时移…...
2022/11/19 21:17:02 - 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...
配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!配置windows update失败 还原更改 请勿关闭计算机&#x…...
2022/11/19 21:17:01 - 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...
不知道大家有没有遇到过这样的一个问题,就是我们的win7系统在关机的时候,总是喜欢显示“准备配置windows,请勿关机”这样的一个页面,没有什么大碍,但是如果一直等着的话就要两个小时甚至更久都关不了机,非常…...
2022/11/19 21:17:00 - 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...
当电脑出现正在准备配置windows请勿关闭计算机时,一般是您正对windows进行升级,但是这个要是长时间没有反应,我们不能再傻等下去了。可能是电脑出了别的问题了,来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...
2022/11/19 21:16:59 - 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...
我们使用电脑的过程中有时会遇到这种情况,当我们打开电脑之后,发现一直停留在一个界面:“配置Windows Update失败,还原更改请勿关闭计算机”,等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢࿰…...
2022/11/19 21:16:58 - 如何在iPhone上关闭“请勿打扰”
Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...
2022/11/19 21:16:57