1 多线程为什么要同步?同步有几种方式??2.但是 据我知道 单线程 多用户访问 可能也需要同步假如A从数据库 获取一个表的10条记录,这个时候B也获得这10条记录此时B删除到其中一条,但是在A看到界面上 ,被B删除的那条还存在,这时A对此条进行修改或删除操作,结果会是怎么样??怎么样避免这种情况 谢谢。。分不多但也至少给50分吧,看到人家发20分的技术贴我就看不下去了。呵呵
解决方案 »
- 关于多线程synchroinzed的问题
- 一个小问题
- 请问我想看看println的源代码在哪儿能找到,歇歇了!!!!
- Socket.getInputStream()阻塞的问题——提供完整代码测试
- 独立的线程当接收到网络数据后怎样通知调用它的那个类,以便进行数据处理
- 怎样得到JTextPane中用insertIcon放置进去的图得到
- 还是关于Date的小问题,在线等,立即结帖。
- 如何获得系统对某一文件类型的默认图标?????如:zip avi rm
- 菜鸟级问题:怎样把一个字符串变量转换为一个整形变量,如果不能转换需要抛出异常?
- main出错,高分求答案
- java正则表达式中:
- Swing中如何让一个TextField获得焦点
2.悲观锁。通过数据库提供的锁机制实现数据访问的排他性。
乐观锁。通过版本记录机制,在数据库表中添加一列version,每次更新时version都加一,在应用系统层实现。
不知道读写锁机制能帮你吗?
如:java中的ReentrantReadWriteLock
嗯 来的有点晚
先说说 1 多线程为什么要同步?同步有几种方式??
不是说多线程就需要同步 需要同不是因为 :有>1个线程希望占有临界资源(注意是占有,也
就是这个线程需要锁定这个资源而并非是要修改这个资源,例如打印机 只能被占用),这个时候
多个线程需要同步,也就是他们之间有一定的互斥性, 同步的方法有 使用同步方法和同步语句块
同步方法的效率要稍微高些 J2SE 5.0过后 有了新的封锁技术 包括Lock()接口与ReentrantLock类
以及ReadWriteLock接口与ReentrantReadWriteLock类这些都在 java.util.concurrent.locks包中第二个问题 数据库的方法上面都说了
但是不用数据库的方法 比如资源A被搜索出来了 但接着被其他人删除了,但先前的人要下载这时
怎么办?
如果是C/S模式的可以用消息来告诉Client端 已经删除了 要更新
但如果是B/S模式最好的方法 的话 B端的操作最好是不要具体的实现 比如你将example.dat删除
不是删除而是重命名为example.dat.del 对用户屏蔽掉.del结尾的文件,这样还可以恢复
真正的delete只有高级管理员才拥有 当其他人要删除已经删除的example.dat时可以很容易的提醒
说是已经被删了,可以区分不存在的和删过的。更新是也屏蔽掉这些功能后缀的文件。
这样可以解决14楼的问题
15楼的问题在B/S模式实现起来 也就乐观锁的思想比较好 可以借鉴一下
先理解一些有关操作系统方面的简单知识。比如:资源、线程、互斥资源。然后,问题就比较好解决了。
线程,你可以想象成程序代码的执行器,只有线程才能执行代码(就现代计算机而言)。
我们知道,程序可以粗浅的分为代码(方法)和数据(成员变量)。
线程相对独立的执行代码(调用方法),而代码(方法)访问数据。
同步,其实,就是实现了资源的互斥访问。
同步的几种方法,上网google一下吧,比我说的要详细。好像有3~4种的样子。
原理就是使用计算机原语对资源上锁。2.但是 据我知道 单线程 多用户访问 可能也需要同步
这句话,我很不理解。多用户访问,我能理解。但是前面加个单线程,我就不明白了。
是多用户,每个用户都用一个线程,访问数据库?
这种情况下,对于数据库来讲,不就是多个线程(每个用户一个线程)在访问相同的数据库么 ?
依然还是多线程访问互斥资源(比如同一张表)的问题呀。后面的话,貌似是怎样保证数据库数据的一致性,当然,也可能不对,我好久没看数据库方面的资料了。
楼主说的数据库方面的这种情况。对于数据库来讲,数据库是通过数据库事物来解决的。
数据库事物,仿佛就像线程同步的synchronized代码块,当然,也有不同点在里面。A用户和B用户在操作过程中,访问了相同的数据域。如果这个数据域是互斥的,那么,可以对数据进行上锁。
至于是锁数据库,还是锁表,还是锁相关的记录行。要看具体数据库支持哪种锁。
这样,在A用户访问表的时候,相关的数据由于上锁,B用户必须等A将资源锁打开,才能进行访问。
这样有效的保证了,两个用户在数据访问的前后,其具体涉及到的数据是一致的。当然,如果楼主有兴趣,可以再去理解一下,数据库事物的隔离级别,如果能够掌握这个知识,
那么,很多情况下,可以很大程度上简化开发的复杂度。
(也就是说,不用显式的用程序代码来上锁,因为,有可能没那个必要)
如果程序开发没有涉及到Hibernate,可以不用考虑乐观锁,这一概念。
操作系统处理多任务的时候采取的是时间片轮转的方式处理的
CPU的时间划分成若干个片段,称为时间片
所以在处理共享数据的时候,就要采用同步
如果不采用同步的话,比如:卖火车票,就剩一张票了,我在订票,这时代码跑到了最后一步,将剩余票减一的时候,时间片轮转了,跑去处理你的任务去了,你也在订票,系统确发现还有一张票,结果确没有,抓狂,尤其春运2.但是 据我知道 单线程 多用户访问 可能也需要同步
是的,比如servlet还有个疑问,为什么要报自己是女生,哎,苦命的程序员
2.楼主第二个问题是不是这样的,假如struts1是单实例单线程的,有多个客户端浏览器(假如说是1,2,3)对他进行访问,这时,也肯定是要同步的,不过这样的后果就是,浏览器2会一直等着浏览器1访问,一直等到浏览器1代码执行完之后才执行浏览器2,同理浏览器3 也是一直等到浏览器2的代码执行完之后才执行。
至于你说的数据库操作的时候,数据库本身会有锁的概念,可以避免多线程产生的问题。
现在有thread1, thread2, obj, 其中thread1和thread2都会读写obj.A这个属性,
那么当这两个线程同时运行时, 就会发生并发问题. 所以在thread1和thread2的代码中, 就要考虑到用lock{}结构, 来锁定obj的属性值.假如thread1 先一步lock住obj, 那么thread2即使运行, 那么也会因为无法访问被lock的obj而强制sleep.
举例: thread1 和thread2同时运行, thread1再运行到某一步后, 必须等待thread2运行完成, 再运行下去, 那么这就是个同步的问题.同步可以用很多方法 解决, 例如Thread Wait()方法.