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处发生系统彻底阻塞,我分析应该是发生了死锁了……当然,从目前的功能模型而言,的确有点繁琐,大可不用这样的流程,只是想了解,这样的流程并不会影响发生死锁啊,运行时也是可行,就是会概率发生阻塞,请高手解答。
展开
2个回答
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询