日期:2014-05-17  浏览次数:20729 次

spring中如何处理多线程对共享数据的并发操作
java原始的多线程并发处理方式通常对共享的变量数据会采用对象锁的机制,控制多线程对共享数据的访问。
在使用spring的时候,查询了网上关于spring多线程并发数据的内容,spring使用的是threadlocal方式,为每一个线程维护自己的一份变量副本。

那么举一个实例,一个应用有一个单例的集合用于存放任务,用户从这个集合中获取任务之后会将获取到的任务从集合中删除。使用spring的时候如果是A、B两个线程同时访问这个集合,按照spring的处理方式为A、B线程各自创建自己的集合副本,疑惑的问题是,假如A线程拿走了集合中的一个任务1,并将这个任务从集合中删掉了,那B线程会出现什么情况呢?会不会也会重复的拿走任务1?还是说A线程对自己的集合副本进行修改的时候会向B线程的集合副本进行同步?

哪位大牛可以给解惑一下。万分感谢。

------解决方案--------------------
锁的机制为了安全,集合被删除了就没有了,所以用的就是空的啊,有啥疑问啊
------解决方案--------------------
引用:
Quote: 引用:

锁的机制为了安全,集合被删除了就没有了,所以用的就是空的啊,有啥疑问啊


我的意思是有一个任务集合里面有一个任务1,A、B两个线程同时访问的时候,spring为每一个线程维护任务集合的副本,就是A拿到的集合副本有任务1,B拿到的集合副本也有任务1。

如果A从集合副本中拿走任务1,并将这个任务1从集合中删除了,那么B是否还会从自己的集合副本中拿到任务1呢?

你想要的效果应该是B拿不到对吧?那就应该在“拿”的时候,将集合锁定,然后拿,然后remove。这样B再次锁定集合,拿的时候,1已经不在了。
------解决方案--------------------
就如LZ说的,既然是多个副本肯定是互相不会影响。就像hibernate的session一样