刚在复习多线程的时候突然有个疑问:
我们都知道WEB容器对于每个请求都是启动一个多线程来处理,那不是所有业务层的代码都要考虑到同步问题。举两个场景:
1. 业务层类有个全局变量count,某个方法使count++,如果两个请求同时调用该方法,count不就有可能+2了,反正就是典型的同步问题。我的意思就是所有业务层代码都要考虑同步?
2. 两个人同时打开了一个单据页面,一个人通过单据页面的删除按钮删除了该单据,另一个人再对该单据执行任意操作不就报错了,这种情况大家是怎么处理的?难道所有操作在业务层代码都要判断该单据是否已被删除?
3. Hibernate进行数据库操作如insert,update,delete有没默认的锁机制?这个机制是怎样的?
望大家指点。
1.如果是单例的而且是修改成员变量需要考虑2.根据事务的隔离级别不同,就是是否允许出现幻读和脏读。3.hibernate的操作都是有事务的,只是根据需要配置不同的隔离级别,你也可以使用乐观锁和悲观锁
这个大体是这样的,web的服务,比如servlet这些都是多线程的。但是具体的方法内部其实已经同步过了,比如doPost或者doGet方法,这些方法内部并不需要考虑多线程的问题。其实哪个线程提供了服务都是无所谓的,http本身是无状态的,因此需要session来记录一些信息。
你说的第二个问题其实和第三个问题有些相似,大体上都是数据库事物的问题。如果是处理事物,数据库自己就会加锁,并不需要我们干预。数据库服务本身就是支持并发的,它总是能够支持多个连接同时访问,但对于事物操作执行总是耗时的。这涉及数据库并发的知识。。。
1、需不需要同步是要根据你的业务来考虑,普通的方法,一直就不是同步的方法。如果这个count是个浏览数,可以不同步,丢个10个8个浏览数也无所谓
2、第二个问题就是我打开了你的帖子,回答问题,提交之前,<atarget="_blank"rel="nofollow">@红薯已经把你的帖子删了,这个时候如果不判断可能会报错,也可能不会报错,具体也得看你的业务有没有这个要求和数据库表的设计,比如这种情况发生的几率有多大,如果是osc这种情况的话,就很少。如果删除和修改都很大的情况下,可以考虑判断一下,再比如就是需要判断,不能出现sql错误。。。那就判断吧,在比如delete只是改个flag,你update的时候没有whereflag条件,更新还能成功呢。。
3、hibernate好久不用,不过hibernate的<spanstyle="font-family:微软雅黑,Verdana,sans-serif,宋体;font-size:14px;line-height:22px;background-color:#FFFFFF;">insert,update,delete默认肯定是没有同步的,需要你自己配置,不配置代码不能自己知道哪个操作需要同步吧
1.++必须要考虑,自己同步,否则业务数据出问题,严重
2.删除/更新问题,一般不考虑,因为即使出错,也是抛出Exception,单个Request失败,只要不影响数据,就可以不考虑,只要做好全局的RuntimeException捕获就可以了。
3.数据库的自身的同步,一般研发可以不考虑。
尽量避免业务类全局变量多线程下操作,也可以用jdk的并发库来解决。版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。