![](https://img-blog.csdnimg.cn/20201014180756754.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
锁
文章平均质量分 86
思想者0001
这个作者很懒,什么都没留下…
展开
-
Select for update就安全了么?间隙锁导致死锁
Select for update就安全了么?背景有一个短信表:CREATE TABLE `t_msg` ( `ID` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT, `Mobile` VARCHAR(20) NOT NULL COMMENT '手机号', `Content` VARCHAR(1000) NOT NULL COMMENT '短信内容', `Status` SMALLINT(6) NOT NULL COMMENT '短信状态;1:待发送;原创 2020-09-25 10:22:10 · 6462 阅读 · 2 评论 -
MySQL 两阶段事务的作用
有如下表:select * from tt;+----+-------+| id | value |+----+-------+| 1 | 1 |+----+-------+有如下方法:@Transactional(rollbackFor = Exception.class, isolation = Isolation.READ_COMMITTED)public int increAndGet(int id){ incre(id); return get(id)原创 2020-08-26 11:42:25 · 138 阅读 · 0 评论 -
记一次MySQL重复插入问题 可重复读和读提交 间隙锁
问题描述MySQL 5.7 有表t2:CREATE TABLE `t2` ( `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, `idx_f` INT(10) UNSIGNED NOT NULL DEFAULT '0', PRIMARY KEY (`id`), INDEX `idx_f` (`idx_f`))COLLATE='utf8_general_ci'ENGINE=InnoDB;mysql> select * from t2;+原创 2020-08-13 21:52:16 · 1157 阅读 · 0 评论 -
读锁有什么用?读为什么要加锁?
读为什么要加锁?1、有些同学认为读锁没有用,他们的理由是:读操作又不会修改数据,想读就读呗,无论读的是就值还是新值,反正能读到。2、也有同学认为读锁是为了防止多线程读到的数据不一致。我认为不是这个原因,只需要问两个问题就知道了,首先问不一致的是什么?然后反问不一致会导致什么问题呢?有些同学认为不一致就是有些线程读的是旧值,有些读的是新值,所以不一致。但是反问导致什么问题,就不是很好回答了,可能回答说为了保险吧,哈哈哈。实际上即使加读锁,还是会存在有的线程读旧值,有的线程读新值,甚至非公平锁情况下,原创 2020-07-16 19:58:55 · 14847 阅读 · 21 评论 -
彻底理解死锁和活锁 java实现
以下使用转账场景来解释说明以上问题,首先认识两个基础类:抽象账户类和工具类:抽象账户类/** * 账户抽象类,由子类实现转账操作 */public abstract class AbstractAccount { //用户名 public String name; //余额 public int balance = 0; //账户锁 public final Lock LOCK = new ReentrantLock(); //构造方法原创 2020-07-10 11:29:39 · 1854 阅读 · 1 评论 -
java stop方法为什么不能用?
一方面stop线程非常粗暴,除非可能执行finally代码块以及释放synchronized外,线程将直接被终止,非常粗暴,此外如果线程持有JUC的互斥锁,还可能导致锁来不及释放,造成其他线程永远等待的局面。JUC是Lock不是自动释放的,需要主动释放并且要在finally代码块中释放,实际上是stop一个线程并不会跳过finally代码块,但是如果还没有执行try代码块就被stop了,那就不会执行finally代码块,这会造成"锁"永远不会释放,而其他线程永远无法获取锁的尴尬局面了。测试代码:pub原创 2020-07-07 23:09:00 · 831 阅读 · 0 评论 -
深入理解AQS-2 锁基础知识
悲观锁和乐观锁synchronized同步方法最主要的问题是线程阻塞和唤醒带来的性能消耗,阻塞同步是悲观的并发策略,只要有可能出现竞争,都认为一定要先加锁;然而还有一种乐观的并发策略,直接操作数据,如果没有发现其他线程同时操作数据则认为这个操作是成功的,如果其他线程也操作了数据,那么操作是失败的,一般采用不断重试的手段(自旋),直到成功为止。乐观策略适用于并发程度不高且临界区较小的场景,优点是不需要阻塞线程,属于非阻塞同步手段,性能更高。CAS乐观锁并发策略主要有两个重点阶段,一个是对数据进行操作,另原创 2020-06-29 19:54:35 · 329 阅读 · 0 评论