如何同时对多个实例化对象加锁

guzhichongshi 2017-01-21 05:17:08
有个类a,通过其实例化出多个对象A,B,C,D……每个对象都是被多线程操作
因此现在的做法是在操作任意对象时加锁synchronized,保证数据唯一
现在有个需求是要在一个线程中同时对多个对象操作,synchronized并不能一次锁住多个对象
那么在此需求下如何操作可以解决问题?
...全文
923 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
X元素 2017-01-23
  • 打赏
  • 举报
回复
引用 9 楼 guzhichongshi 的回复:
[quote=引用 8 楼 u011619071 的回复:] [quote=引用 6 楼 guzhichongshi 的回复:] [quote=引用 5 楼 u011619071 的回复:] [quote=引用 4 楼 guzhichongshi 的回复:] [quote=引用 2 楼 u011619071 的回复:] 没遇到过这种需求,但是楼主可以试试 将lock传递到操作对象的对应方法上,
现在是取出这个对象就要锁上,否则其他线程修改对象的某个参数后数据就会乱掉[/quote] 楼主可以向上抽取一下父类P,其实例化对象对象A,B,C,D…… 都去获取p下的锁。 在 A,B,C,D…… 下 使用P的锁就可以。[/quote] 这种做法算是加类锁了,楼上的那位朋友也是这个想法,但如果每个对象都用类锁锁住,那操作多个对象的时候效率就会很低 比如现在有100个线程分别操作100个对象,这时就会全部等待,其实之间并没有什么交集,只是在我这个需求的前提下就会有些麻烦[/quote] 我只是举个例子,楼主可以设置 不同的几把锁,例如 A B C D .... 你要操作哪个对象,就用哪一把锁。其他对象的操作就不受影响了[/quote]
引用 8 楼 u011619071 的回复:
[quote=引用 6 楼 guzhichongshi 的回复:] [quote=引用 5 楼 u011619071 的回复:] [quote=引用 4 楼 guzhichongshi 的回复:] [quote=引用 2 楼 u011619071 的回复:] 没遇到过这种需求,但是楼主可以试试 将lock传递到操作对象的对应方法上,
现在是取出这个对象就要锁上,否则其他线程修改对象的某个参数后数据就会乱掉[/quote] 楼主可以向上抽取一下父类P,其实例化对象对象A,B,C,D…… 都去获取p下的锁。 在 A,B,C,D…… 下 使用P的锁就可以。[/quote] 这种做法算是加类锁了,楼上的那位朋友也是这个想法,但如果每个对象都用类锁锁住,那操作多个对象的时候效率就会很低 比如现在有100个线程分别操作100个对象,这时就会全部等待,其实之间并没有什么交集,只是在我这个需求的前提下就会有些麻烦[/quote] 我只是举个例子,楼主可以设置 不同的几把锁,例如 A B C D .... 你要操作哪个对象,就用哪一把锁。其他对象的操作就不受影响了[/quote] 尴尬的是ABCD都是随机的……[/quote] 你可以动态 生成锁,
soton_dolphin 2017-01-23
  • 打赏
  • 举报
回复
这种情况只能对A里面的方法加锁了; public class A{ private final Object object = new Object(); public void someSyncMethod(){ synchronized(object){ do some work } } }
guzhichongshi 2017-01-23
  • 打赏
  • 举报
回复
引用 7 楼 pany1209 的回复:
[quote=引用 3 楼 guzhichongshi 的回复:] [quote=引用 1 楼 pany1209 的回复:] 锁住a.class
如果每个操作都是加类锁,效率就会大幅降低[/quote]ThreadLocal可以做吗?[/quote] 额,不行,这个不是解决对象共享访问的
guzhichongshi 2017-01-23
  • 打赏
  • 举报
回复
引用 8 楼 u011619071 的回复:
[quote=引用 6 楼 guzhichongshi 的回复:] [quote=引用 5 楼 u011619071 的回复:] [quote=引用 4 楼 guzhichongshi 的回复:] [quote=引用 2 楼 u011619071 的回复:] 没遇到过这种需求,但是楼主可以试试 将lock传递到操作对象的对应方法上,
现在是取出这个对象就要锁上,否则其他线程修改对象的某个参数后数据就会乱掉[/quote] 楼主可以向上抽取一下父类P,其实例化对象对象A,B,C,D…… 都去获取p下的锁。 在 A,B,C,D…… 下 使用P的锁就可以。[/quote] 这种做法算是加类锁了,楼上的那位朋友也是这个想法,但如果每个对象都用类锁锁住,那操作多个对象的时候效率就会很低 比如现在有100个线程分别操作100个对象,这时就会全部等待,其实之间并没有什么交集,只是在我这个需求的前提下就会有些麻烦[/quote] 我只是举个例子,楼主可以设置 不同的几把锁,例如 A B C D .... 你要操作哪个对象,就用哪一把锁。其他对象的操作就不受影响了[/quote]
引用 8 楼 u011619071 的回复:
[quote=引用 6 楼 guzhichongshi 的回复:] [quote=引用 5 楼 u011619071 的回复:] [quote=引用 4 楼 guzhichongshi 的回复:] [quote=引用 2 楼 u011619071 的回复:] 没遇到过这种需求,但是楼主可以试试 将lock传递到操作对象的对应方法上,
现在是取出这个对象就要锁上,否则其他线程修改对象的某个参数后数据就会乱掉[/quote] 楼主可以向上抽取一下父类P,其实例化对象对象A,B,C,D…… 都去获取p下的锁。 在 A,B,C,D…… 下 使用P的锁就可以。[/quote] 这种做法算是加类锁了,楼上的那位朋友也是这个想法,但如果每个对象都用类锁锁住,那操作多个对象的时候效率就会很低 比如现在有100个线程分别操作100个对象,这时就会全部等待,其实之间并没有什么交集,只是在我这个需求的前提下就会有些麻烦[/quote] 我只是举个例子,楼主可以设置 不同的几把锁,例如 A B C D .... 你要操作哪个对象,就用哪一把锁。其他对象的操作就不受影响了[/quote] 尴尬的是ABCD都是随机的……
guzhichongshi 2017-01-23
  • 打赏
  • 举报
回复
引用 11 楼 soton_dolphin 的回复:
这种情况只能对A里面的方法加锁了; public class A{ private final Object object = new Object(); public void someSyncMethod(){ synchronized(object){ do some work } } }
不同线程下操作的方法也不同,对方法加锁也不影响多线程修改数据
X元素 2017-01-22
  • 打赏
  • 举报
回复
引用 6 楼 guzhichongshi 的回复:
[quote=引用 5 楼 u011619071 的回复:] [quote=引用 4 楼 guzhichongshi 的回复:] [quote=引用 2 楼 u011619071 的回复:] 没遇到过这种需求,但是楼主可以试试 将lock传递到操作对象的对应方法上,
现在是取出这个对象就要锁上,否则其他线程修改对象的某个参数后数据就会乱掉[/quote] 楼主可以向上抽取一下父类P,其实例化对象对象A,B,C,D…… 都去获取p下的锁。 在 A,B,C,D…… 下 使用P的锁就可以。[/quote] 这种做法算是加类锁了,楼上的那位朋友也是这个想法,但如果每个对象都用类锁锁住,那操作多个对象的时候效率就会很低 比如现在有100个线程分别操作100个对象,这时就会全部等待,其实之间并没有什么交集,只是在我这个需求的前提下就会有些麻烦[/quote] 我只是举个例子,楼主可以设置 不同的几把锁,例如 A B C D .... 你要操作哪个对象,就用哪一把锁。其他对象的操作就不受影响了
李德胜1995 2017-01-21
  • 打赏
  • 举报
回复
引用 3 楼 guzhichongshi 的回复:
[quote=引用 1 楼 pany1209 的回复:] 锁住a.class
如果每个操作都是加类锁,效率就会大幅降低[/quote]ThreadLocal可以做吗?
guzhichongshi 2017-01-21
  • 打赏
  • 举报
回复
引用 5 楼 u011619071 的回复:
[quote=引用 4 楼 guzhichongshi 的回复:] [quote=引用 2 楼 u011619071 的回复:] 没遇到过这种需求,但是楼主可以试试 将lock传递到操作对象的对应方法上,
现在是取出这个对象就要锁上,否则其他线程修改对象的某个参数后数据就会乱掉[/quote] 楼主可以向上抽取一下父类P,其实例化对象对象A,B,C,D…… 都去获取p下的锁。 在 A,B,C,D…… 下 使用P的锁就可以。[/quote] 这种做法算是加类锁了,楼上的那位朋友也是这个想法,但如果每个对象都用类锁锁住,那操作多个对象的时候效率就会很低 比如现在有100个线程分别操作100个对象,这时就会全部等待,其实之间并没有什么交集,只是在我这个需求的前提下就会有些麻烦
X元素 2017-01-21
  • 打赏
  • 举报
回复
引用 4 楼 guzhichongshi 的回复:
[quote=引用 2 楼 u011619071 的回复:] 没遇到过这种需求,但是楼主可以试试 将lock传递到操作对象的对应方法上,
现在是取出这个对象就要锁上,否则其他线程修改对象的某个参数后数据就会乱掉[/quote] 楼主可以向上抽取一下父类P,其实例化对象对象A,B,C,D…… 都去获取p下的锁。 在 A,B,C,D…… 下 使用P的锁就可以。
guzhichongshi 2017-01-21
  • 打赏
  • 举报
回复
引用 2 楼 u011619071 的回复:
没遇到过这种需求,但是楼主可以试试 将lock传递到操作对象的对应方法上,
现在是取出这个对象就要锁上,否则其他线程修改对象的某个参数后数据就会乱掉
guzhichongshi 2017-01-21
  • 打赏
  • 举报
回复
引用 1 楼 pany1209 的回复:
锁住a.class
如果每个操作都是加类锁,效率就会大幅降低
X元素 2017-01-21
  • 打赏
  • 举报
回复
没遇到过这种需求,但是楼主可以试试 将lock传递到操作对象的对应方法上,
李德胜1995 2017-01-21
  • 打赏
  • 举报
回复
锁住a.class

67,516

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧