精华帖 (0) :: 良好帖 (0) :: 新手帖 (14) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2008-04-20
public void run
|
|
返回顶楼 | |
发表时间:2008-04-21
结合上面的讨论,经过自己尝试,发现无论是: synchronized(this){ },
还是将 DAO封装到一个方法,都不起作用。研究发现: 1)DAO在Spring的配置中缺省都是singleton的。service也是!!! 2)synchronized(this)是对这个TA对象加锁,这个也没用,因为我的TA对象是每次都初始化一个,拥有不同实例,synchronized(this)也没用。 最后,我的解决方法是: [align=left][align=right][align=center][align=left] public class TA extends Thread{ private static final String done = "done"; BusinessDAO bDAO; public TA(BusinessDAO daoArg){ bDAO = daoArg; } public run(){ synchronized(done){ boolean b = bDAO.findExist(dataList); if(!b){ bDAO.insert(dataList); }else{ bDAO.update(dataList); } } } }[/align][/align][/align][/align] |
|
返回顶楼 | |
发表时间:2008-04-21
kakaluyi 写道 javazhujf 写道 taikeqi 写道 可不可以这样做?
将方法 public run(){ boolean b = bDAO.findExist(dataList); if(!b){ bDAO.insert(dataList); }else{ bDAO.update(dataList); } 改成 public run(){ synchronized(this){ boolean b = bDAO.findExist(dataList); if(!b){ bDAO.insert(dataList); }else{ bDAO.update(dataList); } } run方法是属于某个线程的方法,不会涉及到多线程的并发。 发生问题的原因是有很多线程也就是很多run方法并发调用DAO或者说并发操作数据库, 所以解决问题的地方也是在DAO或者数据库。 向上面的修改方法我想是不起作用的 楼上的说错了吧? synchronized(this)就是用来防止多线程共享资源的问题,像上面那样加锁,我觉的可行,不过要加事务提交,不然insert的dataList还是不存在吧,并等事务提交好再让另一个线程执行应该不会错的 每个线程好象都有自己的对象啊,synchronized(this)貌似锁不住吧? |
|
返回顶楼 | |
发表时间:2008-04-22
可能没个人都有自己理解,你们new 两个同样Thread对象start试试看锁的缩不住 楼主本来就是做个实验,一般Web开发中需要把共有对象的资源继承Thread类吗,本来讨论的就不是实际情况。 |
|
返回顶楼 | |
发表时间:2008-04-23
同意楼上的观点。
这是一个并发的问题,解决的办法通过在线程中增加同步操作,可以解决并发中脏读问题,如何不是和数据库打交到,和其他资源(比如文件存储),我觉得这种方法比较合适。在一般Web应用中,数据库的并发问题,首先需要在事务中进行持久化操作,在事务开始以后,读取数据判断当前数据的状态,然后进行操作。同时需要设置事务隔离级别:RepeatableRead和Serializable都可以解决脏读的问题。 |
|
返回顶楼 | |
发表时间:2008-04-24
万一是集群,那么sync代码段就没用了,最好还是加入事务,并提升隔离级别,我想数据库很少是分布式的吧?
也可以加一个timeStamp类型字段,然后实现一个乐观锁。 |
|
返回顶楼 | |
发表时间:2008-04-24
楼上有见地,赞成
|
|
返回顶楼 | |
发表时间:2008-04-25
这个问题的关键是datalist是怎么拿到的,数据库怎么定义的表还有ibats怎么定义find(datalist)返回true,如果是hibernate的话,如果datalist是自己生成的,那么你怎么find也找不到啊,因为key不一样,自然是新茶如一条。还是实验一下datalist什么情况下返回true在确定是不是同步问题,还是什么问题。
|
|
返回顶楼 | |
发表时间:2008-04-25
这个问题的关键是datalist是怎么拿到的,数据库怎么定义的表还有ibats怎么定义find(datalist)返回true,如果是hibernate的话,如果datalist是自己生成的,那么你怎么find也找不到啊,因为key不一样,自然是新茶如一条。还是实验一下datalist什么情况下返回true在确定是不是同步问题,还是什么问题。
|
|
返回顶楼 | |
发表时间:2008-04-25
用ThreatLocal 类设置一个全局变量可以解决这个问题把
|
|
返回顶楼 | |