1 多线程为什么要同步?同步有几种方式??2.但是 据我知道 单线程 多用户访问 可能也需要同步假如A从数据库 获取一个表的10条记录,这个时候B也获得这10条记录此时B删除到其中一条,但是在A看到界面上 ,被B删除的那条还存在,这时A对此条进行修改或删除操作,结果会是怎么样??怎么样避免这种情况 谢谢。。分不多但也至少给50分吧,看到人家发20分的技术贴我就看不下去了。呵呵

解决方案 »

  1.   

    1.简单的说就是为了防止对共享资源(数据)的脏读。实现方式就是为可能访问共享数据的代码加上synchronized关键字。
    2.悲观锁。通过数据库提供的锁机制实现数据访问的排他性。
    乐观锁。通过版本记录机制,在数据库表中添加一列version,每次更新时version都加一,在应用系统层实现。
      

  2.   

    虽然不能完全理解楼主想表达的意思,但是如果多线程的synchronize帮不了你,数据库的锁机制也解决不了你的问题,你有没有想过通过程序的业务逻辑去间接的实现这么一个同步的效果呢,虽然繁琐,但有时候确实有用,就像类似3楼提供的乐观锁那个概念差不多
      

  3.   

    用ajax应该可以,除了线程同步以外,在客户端定时发送请求,如果有所变动,更新页面,用Ajax,局部更新,用户体验不受影响,同时实现你想要的功能,你看这行不?
      

  4.   

    你这根本就不是线程的同步,这个是用户的同步。这个问题只能是实时的解决,根本就不能用线程去解决,具体问题要具体分析。如果别人删除了一条记录,那么当另一个人在之前查询出来的页面中操作这条记录的时候,你可以提示当前操作的人说 此xxx已经被删除,当然怎么提示是你可以针对不同的权限的人不同的提示,这些都是可控制的。这就像在论坛中看到的一样,如果别人查看已经删除的帖子,就可以提示出错了或是这个帖子不存在或已被删除等等
      

  5.   

    感觉楼主还是在问基于数据库的同步问题 在服务器端的增删改查也是基于数据库的 楼主可以看看各种数据库对同步问题的解决方案 比如像脏读、不可重复读等 还有一些基于数据库的框架如hibernate等也都对同步问题有相应的解决方案
      

  6.   


    不知道读写锁机制能帮你吗?
    如:java中的ReentrantReadWriteLock
      

  7.   

    设置数据库的隔离级别,java.sql.Connection 的 API 中的 5 个 int 类型的常量字段,分别表示 5 种不同的隔离级别。另外,还可以使用乐观锁或者悲观锁来解决。悲观锁把在操作时整个进行加锁,别人无法进行操作,比如 Oracle 中的 for update 就是一种悲观锁,在执行 SELECT t.id, t.name, t.amount FROM t_account t WHERE t.date = xxxx FOR UPDATE; 时将符合条件的记录锁定,此时不允许对该表进行更新操作,这种称为悲观锁,是执行查询时,直接查询结束。乐观锁一般采用版本号的形式,比如 JPA 中使用 @Version 进行标注的属性,这个字段是存在数据表中的一个数值字段。更新时数据连同版本号一并取出,更新完后将版本号加 1 再更新回数据表中,如果该 version 值大于数据表中的 version 字段的值,说明没有人更新过,允许进行更新,否则将会抛出 OptimisticLockException 异常(JPA 中)。现在大多采用的是乐观锁机制。
      

  8.   


    嗯 来的有点晚 
    先说说 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模式实现起来 也就乐观锁的思想比较好 可以借鉴一下
      

  9.   

    1 多线程为什么要同步?同步有几种方式?? 
    先理解一些有关操作系统方面的简单知识。比如:资源、线程、互斥资源。然后,问题就比较好解决了。
    线程,你可以想象成程序代码的执行器,只有线程才能执行代码(就现代计算机而言)。
    我们知道,程序可以粗浅的分为代码(方法)和数据(成员变量)。
    线程相对独立的执行代码(调用方法),而代码(方法)访问数据。
    同步,其实,就是实现了资源的互斥访问。
    同步的几种方法,上网google一下吧,比我说的要详细。好像有3~4种的样子。
    原理就是使用计算机原语对资源上锁。2.但是 据我知道 单线程 多用户访问 可能也需要同步 
    这句话,我很不理解。多用户访问,我能理解。但是前面加个单线程,我就不明白了。
    是多用户,每个用户都用一个线程,访问数据库?
    这种情况下,对于数据库来讲,不就是多个线程(每个用户一个线程)在访问相同的数据库么 ?
    依然还是多线程访问互斥资源(比如同一张表)的问题呀。后面的话,貌似是怎样保证数据库数据的一致性,当然,也可能不对,我好久没看数据库方面的资料了。
    楼主说的数据库方面的这种情况。对于数据库来讲,数据库是通过数据库事物来解决的。
    数据库事物,仿佛就像线程同步的synchronized代码块,当然,也有不同点在里面。A用户和B用户在操作过程中,访问了相同的数据域。如果这个数据域是互斥的,那么,可以对数据进行上锁。
    至于是锁数据库,还是锁表,还是锁相关的记录行。要看具体数据库支持哪种锁。
    这样,在A用户访问表的时候,相关的数据由于上锁,B用户必须等A将资源锁打开,才能进行访问。
    这样有效的保证了,两个用户在数据访问的前后,其具体涉及到的数据是一致的。当然,如果楼主有兴趣,可以再去理解一下,数据库事物的隔离级别,如果能够掌握这个知识,
    那么,很多情况下,可以很大程度上简化开发的复杂度。
    (也就是说,不用显式的用程序代码来上锁,因为,有可能没那个必要)
      

  10.   

    当然,我说的数据库的锁。要有区别于楼上说的 乐观锁。那个是Hibernate里面涉及到的知识。
    如果程序开发没有涉及到Hibernate,可以不用考虑乐观锁,这一概念。
      

  11.   

    1 多线程为什么要同步?同步有几种方式?? 
    操作系统处理多任务的时候采取的是时间片轮转的方式处理的
    CPU的时间划分成若干个片段,称为时间片
    所以在处理共享数据的时候,就要采用同步
    如果不采用同步的话,比如:卖火车票,就剩一张票了,我在订票,这时代码跑到了最后一步,将剩余票减一的时候,时间片轮转了,跑去处理你的任务去了,你也在订票,系统确发现还有一张票,结果确没有,抓狂,尤其春运2.但是 据我知道 单线程 多用户访问 可能也需要同步 
    是的,比如servlet还有个疑问,为什么要报自己是女生,哎,苦命的程序员
      

  12.   

    1.多线程同步是为了防止死锁的问题,不让多个线程同时共享一个资源,如多个线程同事对一个txt文件进行操作,(有一种解决方案是使用单例模式)。
    2.楼主第二个问题是不是这样的,假如struts1是单实例单线程的,有多个客户端浏览器(假如说是1,2,3)对他进行访问,这时,也肯定是要同步的,不过这样的后果就是,浏览器2会一直等着浏览器1访问,一直等到浏览器1代码执行完之后才执行浏览器2,同理浏览器3 也是一直等到浏览器2的代码执行完之后才执行。
      

  13.   

    好像说的不对把,servlet 设计是可不是单线程的啊,你这样的后过就是,创建的网站一次只能一个用户登陆。servlet是单实例多线程的!!!!
      

  14.   

    lz说的第二个问题应该不是java的问题了,应该是db的事务管理。
      

  15.   

    乐观锁 增加个字段updateCount
      

  16.   

    应该没有单线程多用户的的概念吧?呵呵。B/S结构中其实每个用户就是一个线程,C/S结构更不存在一个客户端多个用户的概念。
    至于你说的数据库操作的时候,数据库本身会有锁的概念,可以避免多线程产生的问题。
      

  17.   

    .NET的线程并发问题是指: 有两个或多个线程同时读/写 某个实例的field或property  或 class的静态变量.举例: 
    现在有thread1, thread2, obj, 其中thread1和thread2都会读写obj.A这个属性, 
    那么当这两个线程同时运行时, 就会发生并发问题. 所以在thread1和thread2的代码中, 就要考虑到用lock{}结构, 来锁定obj的属性值.假如thread1 先一步lock住obj, 那么thread2即使运行, 那么也会因为无法访问被lock的obj而强制sleep.
      

  18.   

    上面这段讲了一下, 解决线程并发问题的基本思想.下面再讲一段同步问题.同步是指两个或多个线程协同工作的问题. 
    举例: thread1 和thread2同时运行, thread1再运行到某一步后, 必须等待thread2运行完成, 再运行下去, 那么这就是个同步的问题.同步可以用很多方法 解决, 例如Thread Wait()方法.