java synchronized使用时还是有概率发生死锁怎么回事 100

使用场景:我设计了一个UserManager,用户管理类,集合用的是线程不安全的HashMap,但是在UserManager提供的public方法中:AddUser()R... 使用场景:我设计了一个UserManager,用户管理类,集合用的是线程不安全的HashMap,但是在UserManager提供的public方法中:AddUser() RemoveUser()都使用了如下方法:public class UserManager{ private Map<String,User> users = null; public UserManager(){ users = new HashMap<>(); } public void AddNewUser(String ID){ User p = new User(ID,this); } public void Add(User u){ synchronized(users){ users.put(u.GetID(),u); } }}class User{ private UserManager userManager; private String ID; public User(String id,UserManager um){ ID = id; userManager = um; Add(); } private void Add(){ userManager.Add(this); } public String GetID(){ return ID; }}也可看图。系统的执行顺序是: Manager是一个管理集合,用户记录User,然后外部有n个线程,每个线程可以产生不同的ID字符串,这些的线程通过提供自己产生ID传入调用Manager的AddNewUser方法,AddNewUser产生一个新的User,并将自己的句柄传入User,User在构造中将自己的句柄添加到Manager。这是系统的执行顺序,在n个线程开始执行的时候,有概率在Manager的Add方法中synchronized处发生系统彻底阻塞,我分析应该是发生了死锁了……当然,从目前的功能模型而言,的确有点繁琐,大可不用这样的流程,只是想了解,这样的流程并不会影响发生死锁啊,运行时也是可行,就是会概率发生阻塞,请高手解答。 展开
 我来答
龙的猫
2018-03-02 · TA获得超过447个赞
知道小有建树答主
回答量:562
采纳率:73%
帮助的人:267万
展开全部
user还没构造完成就拿着user去使用,锁里等着user地址呢,user地址等着add完成呢。
new操作不是个原子操作
给个建议usermanager搞成单例的
把userManager从user里独立出来,user不应该持有其管理者的引用。
jokervsbat
2018-03-02 · TA获得超过164个赞
知道小有建树答主
回答量:278
采纳率:51%
帮助的人:61.2万
展开全部
监测一下吧,如果一定时间还没反应,就放弃锁
追问
HashMap是线程不安全的,放弃锁肯定会出问题。
追答
代码流程好复杂
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式