来个Java大佬 38回复/ 512126 浏览

全部回帖

收起
引用 @虎扑JR1596237903 发表的:
只看此人

用户名+锁的一个 map 是为了保证一个用户名在同一时刻只有一个线程在操作的,这做法给搞复杂了但确实有用 😄

用户名+锁的一个 map 是为了保证一个用户名在同一时刻只有一个线程在操作的,这做法给搞复杂了但确实有用 😄

那这样根本不需要用锁,用ConcurrentHashMap就行,用户名作为key,每次putIfAbsent如果返回的是null,那说明还没有线程在进行插入,当前线程进行插入操作。而如果不为null,直接返回就行了

那这样根本不需要用锁,用ConcurrentHashMap就行,用户名作为key,每次putIfAbsent如果返回的是null,那说明还没有线程在进行插入,当前线程进行插入操作。而如果不为null,直接返回就行了

亮了(0)
回复
查看评论(2)
引用 @Elapse丶丶 发表的:
只看此人

那这样根本不需要用锁,用ConcurrentHashMap就行,用户名作为key,每次putIfAbsent如果返回的是null,那说明还没有线程在进行插入,当前线程进行插入操作。而如果不为null,直接返回就行了

那这样根本不需要用锁,用ConcurrentHashMap就行,用户名作为key,每次putIfAbsent如果返回的是null,那说明还没有线程在进行插入,当前线程进行插入操作。而如果不为null,直接返回就行了

你可以试试,这样好像不行。

你可以试试,这样好像不行。

亮了(0)
回复
查看评论(1)
引用 @十一月的萧邦zzz 发表的:
只看此人

写在另一个地方

[图片]

查看更多

写在另一个地方

你这个select改为select for update 就行了

你这个select改为select for update 就行了

亮了(0)
回复
引用 @Elapse丶丶 发表的:
只看此人

那这样根本不需要用锁,用ConcurrentHashMap就行,用户名作为key,每次putIfAbsent如果返回的是null,那说明还没有线程在进行插入,当前线程进行插入操作。而如果不为null,直接返回就行了

那这样根本不需要用锁,用ConcurrentHashMap就行,用户名作为key,每次putIfAbsent如果返回的是null,那说明还没有线程在进行插入,当前线程进行插入操作。而如果不为null,直接返回就行了

那这样的话,map是不是会越来越大呢

那这样的话,map是不是会越来越大呢

亮了(0)
回复
查看评论(2)
引用 @虎扑JR1596237903 发表的:
只看此人

用户名+锁的一个 map 是为了保证一个用户名在同一时刻只有一个线程在操作的,这做法给搞复杂了但确实有用 😄

用户名+锁的一个 map 是为了保证一个用户名在同一时刻只有一个线程在操作的,这做法给搞复杂了但确实有用 😄

我才看明白。。。最笨的方法吧只能说。。。java提供了那么多线程安全的方式不用,要自己写一个map。。。。

我才看明白。。。最笨的方法吧只能说。。。java提供了那么多线程安全的方式不用,要自己写一个map。。。。

亮了(0)
回复
引用 @接球起跳飘逸后仰 发表的:
只看此人

我不推荐用线程锁,不说性能和调优,集群部署以后就没啥用了。换成redis锁吧。然后这种单表单字段的查询肯定要加索引啊。

我不推荐用线程锁,不说性能和调优,集群部署以后就没啥用了。换成redis锁吧。然后这种单表单字段的查询肯定要加索引啊。

这种服务基本上都会部多实例服务吧。反正我们平时不用线程锁,直接怼redis锁或者索引怼库就行了。这种注册业务并发量也不会特别大,一般不会造成数据库连接池爆掉的情况。

这种服务基本上都会部多实例服务吧。反正我们平时不用线程锁,直接怼redis锁或者索引怼库就行了。这种注册业务并发量也不会特别大,一般不会造成数据库连接池爆掉的情况。

亮了(0)
回复
引用 @接球起跳飘逸后仰 发表的:
只看此人

我不推荐用线程锁,不说性能和调优,集群部署以后就没啥用了。换成redis锁吧。然后这种单表单字段的查询肯定要加索引啊。

我不推荐用线程锁,不说性能和调优,集群部署以后就没啥用了。换成redis锁吧。然后这种单表单字段的查询肯定要加索引啊。

这种服务基本上都会部多实例服务吧。反正我们平时不用线程锁,直接怼redis锁或者索引怼库就行了。这种注册业务并发量也不会特别大,一般不会造成数据库连接池爆掉的情况。

这种服务基本上都会部多实例服务吧。反正我们平时不用线程锁,直接怼redis锁或者索引怼库就行了。这种注册业务并发量也不会特别大,一般不会造成数据库连接池爆掉的情况。

亮了(0)
回复
引用 @水熊MAX 发表的:
只看此人

那这样的话,map是不是会越来越大呢

那这样的话,map是不是会越来越大呢

前一个线程可以put的时候,在插入结束的时候clear一下map就行了呗。不会越来越大的。除非你有特别多的集群同时写不同用户名进去。。。

前一个线程可以put的时候,在插入结束的时候clear一下map就行了呗。不会越来越大的。除非你有特别多的集群同时写不同用户名进去。。。

亮了(0)
回复
查看评论(1)

这个不就和

这个不就和

亮了(0)
回复

这不就和超卖问题比较像么,新增用户前要先校验库里的数据。直接保证查询和新增这两步操作的原子性就好啦

这不就和超卖问题比较像么,新增用户前要先校验库里的数据。直接保证查询和新增这两步操作的原子性就好啦

亮了(0)
回复

没用,不管用缓存还是单进程内存。你这么搞的话,会带来数据一致性的问题。要解决数据一致性又要做很多工作和代码保证数据同步。最优解还是数据库唯一索引,取舍后开销最少的方案。

没用,不管用缓存还是单进程内存。你这么搞的话,会带来数据一致性的问题。要解决数据一致性又要做很多工作和代码保证数据同步。最优解还是数据库唯一索引,取舍后开销最少的方案。

亮了(0)
回复
引用 @水熊MAX 发表的:
只看此人

那这样的话,map是不是会越来越大呢

那这样的话,map是不是会越来越大呢

线程执行完插入就能删掉对应的键值对了

线程执行完插入就能删掉对应的键值对了

亮了(0)
回复
查看评论(1)
引用 @十一月的萧邦zzz 发表的:
只看此人

你可以试试,这样好像不行。

你可以试试,这样好像不行。

你自己试下不就行了,putIfAbsent是原子操作,不可能有两个线程同时put成功

你自己试下不就行了,putIfAbsent是原子操作,不可能有两个线程同时put成功

亮了(0)
回复
引用 @Elapse丶丶 发表的:
只看此人

线程执行完插入就能删掉对应的键值对了

线程执行完插入就能删掉对应的键值对了

哦哦,明白了[虎扑表情-这就叫专业]

哦哦,明白了[虎扑表情-这就叫专业]

亮了(0)
回复
引用 @米兰的小铁门 发表的:
只看此人

前一个线程可以put的时候,在插入结束的时候clear一下map就行了呗。不会越来越大的。除非你有特别多的集群同时写不同用户名进去。。。

前一个线程可以put的时候,在插入结束的时候clear一下map就行了呗。不会越来越大的。除非你有特别多的集群同时写不同用户名进去。。。

哦哦[虎扑表情-这就叫专业]

哦哦[虎扑表情-这就叫专业]

亮了(0)
回复

为啥不能添加唯一性索引?一行代码就能解决的问题非得给自己增加难度,你几亿用户啊索引都不能加?加一个索引对插入性能几乎没影响。相反用服务端加锁带来的性能损失要比加索引带来的要高好几个数量级。

为啥不能添加唯一性索引?一行代码就能解决的问题非得给自己增加难度,你几亿用户啊索引都不能加?加一个索引对插入性能几乎没影响。相反用服务端加锁带来的性能损失要比加索引带来的要高好几个数量级。

亮了(0)
回复

reentrantlock有啥用? 难道你服务就一个节点吗? 超过一个那就跟没有一样

reentrantlock有啥用? 难道你服务就一个节点吗? 超过一个那就跟没有一样

亮了(0)
回复

亮了(0)
回复
Re:来个Java大佬
虎扑游戏中心
步行街主干道最热帖
为什么清北和华五,国科大,人大的生源质量差距并不大,大家却普遍认为清北独一档?
为什么高启盛一个大学高材生十分崇尚暴力,而卖鱼的高启强反而喜欢读书?
这个宜居排名看得我一愣一愣
唐尚珺高考预估分数曝光,大概率无缘清华,明年再战?
求助jrm,我该怎么办
评价一下这个成绩
齐齐哈尔烤肉,中国人自己的A5雪花,片片爆汁!
姜萍,你这是自己往死里作?
这牌不让四带二,谁有破解之法
想在国内各大城市举报这样的裸拳赛事,jrs觉得能火吗?
步行街主干道最新帖
大学专业
正品球鞋海外仓
tnnd 长征结束了
就让小编女儿带一次货
有点迷茫了
以下选3个,你怎么选?
迈阿密时装秀-热辣滚烫!
求问
张红到底烧不烧
老哥们,帮忙帮忙推荐一下学校和专业,湖南考生
热门游戏-即点即玩
无需下载,足球经理模式一键即玩
《NBA英雄》教练系统上线啦!我选好了,看看你的